home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / newrender.s < prev    next >
Text File  |  1997-01-31  |  58KB  |  4,107 lines

  1.  
  2. * the 'Hello World' program in 68000 Assembler
  3. * the C version can be found in the Intuition manual
  4.  
  5. * this source code (C) HiSoft 1992 All Rights Reserved
  6.  
  7. * for Devpac Amiga Version 2 the following symbols were changed
  8. * to avoid clashes with the new include files:
  9. * Screen->MyScreen, NewScreen->MyNewScreen
  10. * Window->MyWindow, NewWindow->MyNewWindow
  11.  
  12.     opt    c+,d+
  13.  
  14.     include    workbench:utilities/devpac/system            use pre-assembled header
  15.     include    exec/exec_lib.i
  16.     include    intuition/intuition.i
  17.     include    intuition/intuition_lib.i
  18.     include    graphics/graphics_lib.i
  19.     include    graphics/text.i
  20.  
  21. INTUITION_REV    equ    31        v1.1
  22. GRAPHICS_REV    equ    31        v1.1
  23.  
  24. * Open the intuition library
  25.  
  26.     moveq    #100,d4            default error return code
  27.  
  28.     moveq    #INTUITION_REV,d0    version
  29.     lea    int_name(pc),a1
  30.     CALLEXEC OpenLibrary
  31.     tst.l    d0
  32.     beq    exit_false        if failed then quit
  33.     move.l    d0,_IntuitionBase    else save the pointer
  34.  
  35.     moveq    #GRAPHICS_REV,d0
  36.     lea    graf_name(pc),a1
  37.     CALLEXEC OpenLibrary
  38.     tst.l    d0
  39. ;    beq    exit_closeint        if failed then close Int, exit
  40.     move.l    d0,_GfxBase
  41.     lea    MyNewScreen(pc),a0
  42.     CALLINT    OpenScreen        open a screen
  43.     tst.l    d0
  44. ;    beq    exit_closeall        if failed the close both, exit
  45.     move.l    d0,MyScreen
  46.  
  47.     move.l MyScreen,a0
  48.     lea sc_BitMap(a0),a0
  49.     lea bm_Planes(a0),a0
  50.  
  51.     
  52.     move.l #RAWSCRN,(a0)
  53.     move.l #RAWSCRN+10240,4(a0)
  54.     move.l #RAWSCRN+10240*2,8(a0)
  55.     move.l #RAWSCRN+10240*3,12(a0)
  56.     move.l #RAWSCRN+10240*4,16(a0)
  57.     move.l #RAWSCRN+10240*5,20(a0)
  58.     move.l #RAWSCRN+10240*6,24(a0)
  59.     move.l #RAWSCRN+10240*7,28(a0)
  60.  
  61. * now initialise a NewWindow structure. This is normally easier to
  62. * do with dc.w/dc.l statement etc, but for comparison with the C
  63. * version we do it like this
  64.     lea    MyNewWindow(pc),a0    good place to start
  65.     move.w    #20,nw_LeftEdge(a0)
  66.     move.w    #20,nw_TopEdge(a0)
  67.     move.w    #300,nw_Width(a0)
  68.     move.w    #100,nw_Height(a0)
  69.     move.b    #0,nw_DetailPen(a0)
  70.     move.b    #1,nw_BlockPen(a0)
  71.     move.l    #window_title,nw_Title(a0)
  72. _temp    set    WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
  73.     move.l    #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
  74.     move.l    #CLOSEWINDOW,nw_IDCMPFlags(a0)
  75.     move.w    #CUSTOMSCREEN,nw_Type(a0)
  76.     clr.l    nw_FirstGadget(a0)
  77.     clr.l    nw_CheckMark(a0)
  78.     move.l    MyScreen(pc),nw_Screen(a0)
  79.     clr.l    nw_BitMap(a0)
  80.     move.w    #100,nw_MinWidth(a0)
  81.     move.w    #25,nw_MinHeight(a0)
  82.     move.w    #640,nw_MaxWidth(a0)
  83.     move.w    #200,nw_MaxHeight(a0)
  84.  
  85. * thats it set up, now open the window (a0=NewWindow already)
  86. ;    CALLINT    OpenWindow
  87. ;    tst.l    d0
  88. ;    beq    exit_closescr            if failed
  89. ;    move.l    d0,MyWindow            save it
  90. ;
  91. ;    move.l    d0,a1                window
  92. ;    move.l    wd_RPort(a1),a1            rastport
  93. ;    moveq    #20,d0                X
  94. ;    moveq    #20,d1                Y
  95. ;    CALLGRAF Move                move the cursor
  96. ;
  97. ;    move.l    MyWindow(pc),a0
  98. ;    move.l    wd_RPort(a0),a1            rastport
  99. ;    lea    hello_message(pc),a0
  100. ;    moveq    #11,d0
  101. ;    CALLGRAF Text                print something
  102. ;
  103. ;    move.l    MyWindow(pc),a0
  104. ;    move.l    wd_UserPort(a0),a0
  105. ;    move.b    MP_SIGBIT(a0),d1        (misprint in manual)
  106. ;    moveq    #0,d0
  107. ;    bset    d1,d0                do a shift
  108. ;    CALLEXEC Wait
  109.  
  110. ;    moveq    #0,d4                return code
  111.  
  112. * various exit routines that do tidying up, given a return code in d4
  113.  
  114. ;    move.l    MyWindow(pc),a0
  115. ;    CALLINT CloseWindow
  116.  
  117. ;exit_closescr
  118. ;    move.l    MyScreen(pc),a0
  119. ;    CALLINT CloseScreen
  120.  
  121. ;exit_closeall
  122. ;    move.l    _GfxBase(pc),a1
  123. ;    CALLEXEC CloseLibrary
  124.  
  125. ;exit_closeint
  126. ;    move.l    _IntuitionBase(pc),a1
  127. ;    CALLEXEC CloseLibrary
  128.  
  129. ;done:
  130. ;    bra done
  131.  
  132.  move.l #PALETTEBIT,a0
  133.  move.l #COPIEDPAL+4,a1
  134.  move.w #255,d0
  135.  
  136. copydown:
  137.  move.b 1(a0),(a1)
  138.  move.b 3(a0),4(a1)
  139.  move.b 5(a0),8(a1)
  140.  add.w #6,a0
  141.  add.w #12,a1
  142.  dbra d0,copydown
  143.  
  144.  move.w #256,COPIEDPAL
  145.  move.w #0,COPIEDPAL+2
  146. LOOKFORME:
  147.  move.l MyScreen,a0
  148.  lea sc_ViewPort(a0),a0
  149.  move.l #COPIEDPAL,a1
  150.  move.l _GfxBase,a6
  151.  jsr -$372(a6)
  152.  
  153.  move.l MyScreen,a4
  154.  move.w sc_MouseX(a4),d0
  155.  move.w sc_MouseY(a4),d1
  156.  move.w d0,OLDXM
  157.  move.w d1,OLDYM
  158.     
  159.  move.l 4.w,a6
  160.  move.l #doslibname,a1
  161.  moveq #0,d0
  162.  jsr -552(a6)
  163.  move.l d0,doslib
  164.  
  165.  move.l doslib,a6
  166.  move.l #OBJNAME,d1
  167.  move.l #1005,d2
  168.  jsr -30(a6)
  169.  move.l d0,ROTATEDPTS
  170.  
  171.  move.l doslib,a6
  172.  move.l d0,d1
  173.  move.l #POLYGONDATA,d2
  174.  move.l #30000,d3
  175.  jsr -42(a6)
  176.  
  177.  move.l doslib,a6
  178.  move.l ROTATEDPTS,d1
  179.  jsr -36(a6)
  180.  
  181.     
  182. loop:
  183.  
  184.  move.l #POLYGONDATA,a3
  185.  move.w (a3)+,SORTIT
  186.  move.l a3,START_OF_OBJECT
  187.     
  188.  move.w (a3)+,num_points
  189.  move.w (a3)+,d6
  190.  move.w d6,num_frames
  191.  move.l a3,POINTER_TO_POINTERS
  192.  lea (a3,d6.w*4),a3
  193.  move.l a3,LinesPtr
  194.  moveq #0,d5
  195.  moveq #0,d2
  196.  
  197.  move.l POINTER_TO_POINTERS,a4
  198.  move.w (a4,d5.w*4),d2
  199.  add.l START_OF_OBJECT,d2
  200.  move.l d2,PtsPtr
  201.  move.w 2(a4,d5.w*4),d5
  202.  add.l START_OF_OBJECT,d5
  203.  move.l d5,PolyAngPtr
  204.  move.l d2,a3
  205.  move.w num_points,d5
  206.  
  207.  move.l (a3)+,OBJONOFF
  208.  
  209.  move.l a3,PointAngPtr
  210.  add.w d5,d5
  211.  move.w d5,d2
  212.  add.w d5,d5
  213.  add.w d5,d2
  214.  add.w d2,a3
  215.  move.l a3,PtsPtr
  216.  
  217.  move.l MyScreen,a4
  218.  move.w sc_MouseX(a4),d0
  219.  move.w sc_MouseY(a4),d1
  220.  
  221.  sub.w OLDXM,d0
  222.  sub.w OLDYM,d1
  223.  add.w d0,OLDXM
  224.  add.w d1,OLDYM
  225.  
  226.  btst #6,$bfe001
  227.  beq.s .SHIFTABOUT
  228.  
  229.  muls #8190,d0
  230.  divs #320,d0
  231.  add.w d0,YANG
  232.  and.w #8190,YANG
  233.  muls #8190,d1
  234.  divs #320,d1
  235.  and.w #8190,d1
  236.  add.w d1,XANG
  237.  and.w #8190,XANG
  238.  
  239. ; add.w #40,AANG
  240. ; add.w #70,BANG
  241. ; and.w #8191,AANG
  242. ; and.w #8191,BANG
  243.  
  244. ; add.w #60,CANG
  245. ; add.w #90,DANG
  246. ; and.w #8191,CANG
  247. ; and.w #8191,DANG
  248.  
  249.  
  250.  bra .ROTABOUT
  251. .SHIFTABOUT
  252.  
  253.   muls #8190,d0
  254.  divs #320,d0
  255.  add.w d0,BANG
  256.  and.w #8190,BANG
  257.  muls #8190,d1
  258.  divs #320,d1
  259.  and.w #8190,d1
  260.  add.w d1,AANG
  261.  and.w #8190,AANG
  262.  
  263.  
  264. .ROTABOUT
  265.  
  266.  move.w AANG,d1
  267.  move.w BANG,d3
  268. ; cmp.w #2,d6
  269. ; bne.s .notsecrot
  270. ; move.w CANG,d1
  271. ; move.w DANG,d3
  272. ;.notsecrot
  273.  move.l #SINETABLE,a1
  274.  move.w (a1,d1.w),XSIN    ;xsin
  275.  move.w (a1,d3.w),YSIN    ;ysin
  276.  
  277.  add.w #2048,a1
  278.  move.w (a1,d1.w),XCOS    ;xcos
  279.  move.w (a1,d3.w),YCOS    ;ycos
  280.  
  281.  move.w XANG,d1
  282.  move.w YANG,d3
  283. ; cmp.w #2,d6
  284. ; bne.s .notsecrot
  285. ; move.w CANG,d1
  286. ; move.w DANG,d3
  287. ;.notsecrot
  288.  move.l #SINETABLE,a1
  289.  move.w (a1,d1.w),XSIN2    ;xsin
  290.  move.w (a1,d3.w),YSIN2    ;ysin
  291.  
  292.  add.w #2048,a1
  293.  move.w (a1,d1.w),XCOS2    ;xcos
  294.  move.w (a1,d3.w),YCOS2    ;ycos
  295.  
  296.  
  297. ************************************************
  298. ************************************************
  299. ************************************************
  300. ************************************************
  301. ************************************************
  302. ************************************************
  303. ************************************************
  304. ************************************************
  305. ************************************************
  306. ************************************************
  307. ************************************************
  308. ************************************************
  309. ************************************************
  310. ************************************************
  311.  
  312. *SHADOW BUFFER CALCULATION
  313.  
  314.  
  315. ; First, calculate the normal brightnesses
  316. ; for points. NB: -1,-1,-1 = this point not used
  317. ; in gouraud shading.
  318.  
  319.  move.l #NORMBRIGHTS,a2
  320.  move.l PointAngPtr,a0
  321.  move.w num_points,d7
  322.  
  323.  move.l #NORMVECTS,a5
  324.  
  325.  subq #1,d7
  326.  
  327. CALCNORMBRIGHTS:
  328.  
  329.  move.w (a0)+,d0
  330.  move.w (a0)+,d1
  331.  move.w (a0)+,d2
  332.  
  333.  move.w #0,d6
  334.  
  335.  cmp.w #-1,d0
  336.  bne.s .notnot
  337.  cmp.w #-1,d1
  338.  bne.s .notnot
  339.  cmp.w #-1,d2
  340.  bne.s .notnot
  341.  
  342.  move.w #-1,x1
  343.  move.w #-1,y1
  344.  move.w #-1,z1
  345.  bra .dontbother
  346.  
  347. .notnot:
  348.  neg.w d1
  349.  
  350.  move.w d0,d3
  351.  move.w d2,d5
  352.  
  353.  muls YCOS,d0
  354.  muls YSIN,d2
  355.  sub.l d2,d0
  356.  add.l d0,d0
  357.  swap d0
  358. ; asr.l #6,d0    ; new x*512
  359.  
  360.  muls YSIN,d3
  361.  muls YCOS,d5
  362.  add.l d5,d3
  363.  add.l d3,d3
  364.  swap d3
  365.  move.w d3,d2    ; new z
  366.  
  367.  move.w d1,d4
  368.  move.w d2,d5
  369.  muls XCOS,d1
  370.  muls XSIN,d2
  371.  sub.l d2,d1
  372.  add.l d1,d1
  373.  swap d1
  374.  
  375.  muls XSIN,d4
  376.  muls XCOS,d5
  377.  add.l d5,d4
  378.  add.l d4,d4
  379.  swap d4
  380.  move.w d4,d2    ; new z
  381.  
  382.  
  383.  move.w d0,d3
  384.  move.w d2,d5
  385.  
  386.  muls YCOS2,d0
  387.  muls YSIN2,d2
  388.  sub.l d2,d0
  389.  add.l d0,d0
  390.  swap d0
  391.  
  392.  muls YSIN2,d3
  393.  muls YCOS2,d5
  394.  add.l d5,d3    
  395.  add.l d3,d3
  396.  swap d3
  397.  move.w d3,d2    ; new z
  398.  
  399.  move.w d1,d4
  400.  move.w d2,d5
  401.  muls XCOS2,d1
  402.  muls XSIN2,d2
  403.  sub.l d2,d1
  404.  add.l d1,d1
  405.  swap d1
  406.  
  407.  muls XSIN2,d4
  408.  muls XCOS2,d5
  409.  add.l d5,d4
  410.  add.l d4,d4
  411.  swap d4
  412.  
  413.  move.w d0,x1
  414.  move.w d1,y1
  415.  move.w d4,z1
  416.  
  417.  
  418.  move.w d1,d6    ; new y 
  419.  
  420.  asr.w #4,d6
  421.  add.w #20,d6
  422.  
  423.  ble.s .okokok
  424.  
  425.  moveq #0,d6
  426.  
  427. .okokok:
  428.  add.w #$1c,d6
  429.  bge.s .okokokok
  430.  moveq #0,d6
  431. .okokokok:
  432.  
  433.  add.w #64,d6
  434.  
  435. ; cmp.w #28,d6
  436. ; blt.s .okbig
  437. ; move.w #28,d6
  438. ;.okbig
  439.  
  440. .dontbother:
  441.  move.w x1,(a5)+
  442.  move.w y1,(a5)+
  443.  move.w z1,(a5)+
  444.  move.w d6,(a2)+
  445.  
  446.  dbra d7,CALCNORMBRIGHTS
  447.  
  448.  
  449. ; Next, calculate the point coords for
  450. ; the shadow buffer.
  451.  
  452.  move.l #SHADOWPTS,a2
  453.  move.l PtsPtr,a0
  454.  move.w num_points,d7
  455.  subq #1,d7
  456.  
  457. ROTPTLOPSHAD:
  458.  move.w (a0)+,d0
  459.  move.w d0,d3
  460.  move.w (a0)+,d1
  461.  move.w (a0)+,d2
  462.  move.w d2,d5
  463.  
  464.  muls YCOS,d0
  465.  muls YSIN,d2
  466.  sub.l d2,d0
  467.  add.l d0,d0
  468.  swap d0
  469. ; asr.l #6,d0    ; new x*512
  470.  
  471.  muls YSIN,d3
  472.  muls YCOS,d5
  473.  add.l d5,d3
  474.  add.l d3,d3
  475.  swap d3
  476.  move.w d3,d2    ; new z
  477.  
  478.  move.w d1,d4
  479.  move.w d2,d5
  480.  muls XCOS,d1
  481.  muls XSIN,d2
  482.  sub.l d2,d1
  483.  add.l d1,d1
  484.  swap d1
  485.  
  486.  muls XSIN,d4
  487.  muls XCOS,d5
  488.  add.l d5,d4
  489.  add.l d4,d4
  490.  swap d4
  491.  move.w d4,d2    ; new z
  492.   
  493.  move.w d0,d3
  494.  move.w d2,d5
  495.  
  496.  muls YCOS2,d0
  497.  muls YSIN2,d2
  498.  sub.l d2,d0
  499.  asr.l #6,d0    ; new x*512
  500.  
  501.  muls YSIN2,d3
  502.  muls YCOS2,d5
  503.  add.l d5,d3
  504.  add.l d3,d3
  505.  swap d3
  506.  move.w d3,d2    ; new z
  507.  
  508.  move.w d1,d4
  509.  move.w d2,d5
  510.  muls XCOS2,d1
  511.  muls XSIN2,d2
  512.  sub.l d2,d1
  513.  asr.l #6,d1    ; new y*512
  514.  
  515.  muls XSIN2,d4
  516.  muls XCOS2,d5
  517.  add.l d5,d4
  518.  add.l d4,d4
  519.  swap d4
  520.  move.w d4,d2    ; new z
  521.  
  522.  ext.l d2
  523.  
  524.  move.w XOFF,d5
  525.  ext.l d5
  526.  asl.l #8,d5
  527.  add.l d5,d5
  528.  add.l d5,d0
  529.  
  530.  move.l d0,(a2)+
  531.  move.l d1,(a2)+
  532.  move.w d2,(a2)+
  533.  
  534.  dbra d7,ROTPTLOPSHAD
  535.  
  536.  
  537.  
  538. ***************************************
  539. * Calculate viewer position for specularity..
  540.  
  541.  move.w #0,d0
  542.  move.w #0,d1
  543.  move.w #-1024,d2
  544.  
  545. ; move.w d0,d3
  546. ; move.w d2,d5
  547. ;
  548. ; muls YCOS,d0
  549. ; muls YSIN,d2
  550. ; sub.l d2,d0
  551. ; add.l d0,d0
  552. ; swap d0
  553. ; asr.l #6,d0    ; new x*512
  554. ; muls YSIN,d3
  555. ; muls YCOS,d5
  556. ; add.l d5,d3
  557. ; add.l d3,d3
  558. ; swap d3
  559. ; move.w d3,d2    ; new z
  560. ;
  561. ; move.w d1,d4
  562. ; move.w d2,d5
  563. ; muls XCOS,d1
  564. ; muls XSIN,d2
  565. ; sub.l d2,d1
  566. ; add.l d1,d1
  567. ; swap d1
  568. ; muls XSIN,d4
  569. ; muls XCOS,d5
  570. ; add.l d5,d4
  571. ; add.l d4,d4
  572. ; swap d4
  573. ; move.w d4,d2    ; new z
  574.  
  575.  move.w d0,d3
  576.  move.w d2,d5
  577.  
  578.  muls YCOS2,d0
  579.  muls YSIN2,d2
  580.  sub.l d2,d0
  581.  add.l d0,d0
  582.  swap d0
  583.  
  584.  muls YSIN2,d3
  585.  muls YCOS2,d5
  586.  add.l d5,d3    
  587.  add.l d3,d3
  588.  swap d3
  589.  move.w d3,d2    ; new z
  590.  
  591.  move.w d1,d4
  592.  move.w d2,d5
  593.  muls XCOS2,d1
  594.  muls XSIN2,d2
  595.  sub.l d2,d1
  596.  add.l d1,d1
  597.  swap d1
  598. ; asr.l #6,d1    ; new y*512
  599.  
  600.  muls XSIN2,d4
  601.  muls XCOS2,d5
  602.  add.l d5,d4
  603.  add.l d4,d4
  604.  swap d4
  605.  
  606.  move.w d0,x2b
  607.  move.w d1,y2b
  608.  move.w d4,z2b
  609.  
  610. ; Now the specular highlight efforts....
  611.  
  612.  move.l #SPECBRIGHTS,a2
  613.  move.l #NORMVECTS,a1
  614.  
  615.  move.l #SHADOWPTS,a5
  616.  
  617.  move.w num_points,d7
  618.  subq #1,d7
  619.  
  620. CALCSPECBRIGHTS:
  621.  
  622.  move.w (a1)+,x1
  623.  move.w (a1)+,y1
  624.  move.w (a1)+,z1
  625.  
  626.  move.w x2b,d0
  627.  move.l (a5)+,d1
  628.  asr.l #8,d1
  629.  asr.l #1,d1
  630.  sub.w d1,d0
  631.  move.w d0,x2
  632.  move.w y2b,d0
  633.  move.l (a5)+,d1
  634.  asr.l #8,d1
  635.  asr.l #1,d1
  636.  sub.w d1,d0
  637.  move.w d0,y2
  638.  move.w z2b,d0
  639.  sub.w (a5)+,d0
  640.  move.w d0,z2
  641.  
  642.  move.w #0,d6
  643.  
  644.  cmp.w #-1,x1
  645.  bne.s .notnot
  646.  cmp.w #-1,y1
  647.  bne.s .notnot
  648.  cmp.w #-1,z1
  649.  beq .dontbother
  650. .notnot: 
  651.  
  652.  move.w x2,d2
  653.  muls d2,d2
  654.  move.w y2,d1
  655.  muls d1,d1
  656.  add.l d1,d2
  657.  move.w z2,d1
  658.  muls d1,d1
  659.  add.l d1,d2
  660.  
  661.  jsr CALCSQROOT
  662.  
  663.  move.w d2,l2
  664.  
  665.  move.w y1,d0
  666.  muls z2,d0
  667.  move.w y2,d1
  668.  muls z1,d1
  669.  sub.l d1,d0    ; x4
  670.  
  671.  move.w z1,d1
  672.  muls x2,d1
  673.  move.w z2,d2
  674.  muls x1,d2
  675.  sub.l d2,d1    ; y4
  676.  
  677.  move.w x1,d2
  678.  muls y2,d2
  679.  move.w x2,d3
  680.  muls y1,d3
  681.  sub.l d3,d2    ; z4
  682.  
  683.  asr.l #8,d0
  684.  asr.l #8,d1
  685.  asr.l #8,d2
  686.  asr.l #2,d0
  687.  asr.l #2,d1
  688.  asr.l #2,d2
  689.  
  690.  move.w x1,d3
  691.  muls d1,d3
  692.  move.w y1,d4
  693.  muls d0,d4
  694.  sub.l d4,d3
  695.  asr.l #8,d3
  696.  asr.l #1,d3
  697.  add.w z2,d3
  698.  
  699.  muls #1024,d3
  700.  divs l2,d3
  701.  
  702.  move.w d3,z3
  703.  
  704.  move.w y1,d3
  705.  muls d2,d3
  706.  move.w z1,d4
  707.  muls d1,d4
  708.  sub.l d4,d3
  709.  asr.l #8,d3
  710.  asr.l #1,d3
  711.  add.w x2,d3
  712.  muls #1024,d3
  713.  divs l2,d3
  714.  
  715.  move.w d3,x3
  716.  
  717.  move.w z1,d3
  718.  muls d0,d3
  719.  move.w x1,d4
  720.  muls d2,d4
  721.  sub.l d4,d3
  722.  asr.l #8,d3
  723.  asr.l #1,d3
  724.  add.w y2,d3
  725.  muls #1024,d3
  726.  divs l2,d3
  727.  
  728.  move.w d3,y3
  729.  
  730.  move.w z3,d3
  731.  asr.w #4,d3
  732.  add.w #128,d3
  733.  bge.s .okpp
  734.  moveq #0,d3
  735. .okpp
  736.  cmp.w #255,d3
  737.  ble.s .okppp
  738.  move.w #255,d3
  739. .okppp
  740.  
  741.  move.b d3,d6
  742.  lsl.w #8,d6
  743.  
  744.  move.w x3,d3
  745.  asr.w #4,d3
  746.  
  747.  add.w #128,d3
  748.  bge.s .okp
  749.  moveq #0,d3
  750. .okp
  751.  cmp.w #255,d3
  752.  ble.s .okpppp
  753.  move.w #255,d3
  754. .okpppp
  755.  move.b d3,d6
  756.   
  757.  tst.w y3
  758.  blt.s .okpos
  759.  
  760.  move.w x3,d1
  761.  asr.w #4,d1
  762.  move.w z3,d2
  763.  asr.w #4,d2
  764.  
  765.  muls d1,d1
  766.  muls d2,d2
  767.  add.l d1,d2
  768.  jsr CALCSQROOT
  769.  tst.w d2
  770.  beq.s .okpos
  771.  
  772.  move.w d2,d3
  773.  neg.w d3
  774.  add.w #127,d3
  775.  
  776.  move.w z3,d4
  777.  muls d3,d4
  778.  divs d2,d4
  779.  asr.w #4,d4
  780.  add.w #128,d4
  781.  move.b d4,d6
  782.  lsl.w #8,d6
  783.  
  784.  move.w x3,d4
  785.  muls d3,d4
  786.  divs d2,d4
  787.  asr.w #4,d4
  788.  add.w #128,d4
  789.  move.b d4,d6
  790.  
  791. ; neg.w y3
  792.  
  793. .okpos
  794.   
  795. ; add.w y2,d3
  796. ;
  797. ; move.w d3,d6
  798. ;
  799. ; asr.w #4,d6
  800. ; add.w #30,d6
  801. ; ble.s .okokok
  802. ; moveq #0,d6
  803. ;.okokok:
  804. ; add.w #$1c,d6
  805. ; bge.s .okokokok
  806. ; moveq #0,d6
  807. ;.okokokok:
  808.  
  809. ; cmp.w #28,d6
  810. ; blt.s .okbig
  811. ; move.w #28,d6
  812. ;.okbig
  813.  
  814. .dontbother:
  815.  move.w d6,(a2)+
  816.  move.w y3,(a2)+
  817.  
  818.  dbra d7,CALCSPECBRIGHTS
  819.  
  820.  
  821.  
  822.  
  823. * NOW THE POINTS FOR ON-SCREENNESS
  824.  
  825.  move.l #ROTATEDPTS,a2
  826.  move.l PtsPtr,a0
  827.  move.w num_points,d7
  828.  subq #1,d7
  829.  
  830. ROTPTLOP:
  831.  
  832.  move.w (a0)+,d0
  833.  move.w d0,d3
  834.  move.w (a0)+,d1
  835.  move.w (a0)+,d2
  836.  move.w d2,d5
  837.  
  838.  
  839.  
  840.  muls YCOS,d0
  841.  muls YSIN,d2
  842.  sub.l d2,d0
  843.  asr.l #6,d0    ; new x*512
  844.  
  845.  muls YSIN,d3
  846.  muls YCOS,d5
  847.  add.l d5,d3
  848.  add.l d3,d3
  849.  swap d3
  850.  move.w d3,d2    ; new z
  851.  
  852.  move.w d1,d4
  853.  move.w d2,d5
  854.  muls XCOS,d1
  855.  muls XSIN,d2
  856.  sub.l d2,d1
  857.  asr.l #6,d1    ; new y*512
  858.  
  859.  muls XSIN,d4
  860.  muls XCOS,d5
  861.  add.l d5,d4
  862.  add.l d4,d4
  863.  swap d4
  864.  move.w d4,d2    ; new z
  865.  
  866.  ext.l d2
  867.  
  868.  move.w XOFF,d5
  869.  ext.l d5
  870.  asl.l #8,d5
  871.  add.l d5,d5
  872.  add.l d5,d0
  873.  
  874.  move.l d0,(a2)+
  875.  move.l d1,(a2)+
  876.  move.w d2,(a2)+
  877.  
  878.  dbra d7,ROTPTLOP
  879.  
  880. ; Now convert the rotated points to the screen:
  881.  
  882.  move.l #ROTATEDPTS,a0
  883.  move.l #ONSCREENPTS,a2
  884.  move.w num_points,d7
  885.  subq #1,d7
  886. CONVERTTOSCREEN:
  887.  move.l (a0)+,d0
  888.  move.l (a0)+,d1
  889.  move.w (a0)+,d2
  890.  add.w ZOFF,d2
  891.  ext.l d2
  892.  
  893.  move.l d0,d3
  894.  asr.l #1,d3
  895.  add.l d3,d0 
  896.  move.l d1,d3
  897.  asr.l #1,d3
  898.  add.l d3,d1 
  899.  
  900.  divs d2,d0
  901.  divs d2,d1
  902.  add.w #160*4,d0
  903.  add.w #128*4,d1
  904.  move.w d0,(a2)+
  905.  move.w d1,(a2)+
  906.  dbra d7,CONVERTTOSCREEN
  907.  
  908.  move.w #254,HIGHPOLY
  909.  
  910.  move.l LinesPtr,a1
  911.  move.l #PartBuffer,a0
  912.  move.l a0,a2
  913.  move.w #15,d0
  914. clrpartbuffSHAD:
  915.  move.l #$80000001,(a2)+
  916.  move.l #$80000001,(a2)+
  917.  move.l #$80000001,(a2)+
  918.  move.l #$80000001,(a2)+
  919.  dbra d0,clrpartbuffSHAD
  920.  
  921.  move.l #SHADOWPTS,a2
  922.  move.l OBJONOFF,d5
  923.  
  924.  move.w #0,d4
  925.  tst.w SORTIT
  926.  bne.s PutInPartsSHAD
  927.  
  928.  
  929. putinunsortedSHAD:
  930.  move.w (a1)+,d7
  931.  blt doneallpartsSHAD
  932.  lsr.l #1,d5
  933.  bcs.s .yeson
  934.  addq #2,a1
  935.  bra putinunsortedSHAD
  936. .yeson:
  937.  
  938.  move.w (a1)+,d6
  939.  move.l #0,(a0)+
  940.  move.w d7,(a0)+
  941.  move.w d4,(a0)+
  942.  addq #1,d4
  943.  bra putinunsortedSHAD
  944.  
  945. PutInPartsSHAD
  946.  move.w (a1)+,d7
  947.  blt doneallpartsSHAD
  948.  
  949.  lsr.l #1,d5
  950.  bcs.s .yeson
  951.  addq #2,a1
  952.  bra PutInPartsSHAD
  953. .yeson:
  954.  
  955.  move.w (a1)+,d6
  956.  move.l 4(a2,d6.w),d0
  957.  add.l #200000,d0
  958.  
  959.  move.l #PartBuffer-8,a0
  960.  
  961. stillfrontSHAD
  962.  addq #8,a0
  963.  cmp.l (a0),d0
  964.  blt stillfrontSHAD
  965.  move.l #endparttab-8,a5
  966. domoreshiftSHAD:
  967.  move.l -8(a5),(a5)
  968.  move.l -4(a5),4(a5)
  969.  subq #8,a5
  970.  cmp.l a0,a5
  971.  bgt.s domoreshiftSHAD
  972.  
  973.  move.l d0,(a0)
  974.  move.w d7,4(a0)
  975.  move.w d4,6(a0)
  976.  addq #1,d4
  977.  bra PutInPartsSHAD
  978.  
  979. doneallpartsSHAD:
  980.  
  981.  move.l #PartBuffer,a0
  982.  
  983. PartLoopSHAD
  984.  move.l (a0)+,d7
  985.  blt nomorepartsSHAD
  986.  
  987.  move.l #SAVEHIGHS,a2
  988.  move.w 2(a0),d0
  989.  move.w HIGHPOLY,(a2,d0.w*2)
  990.  
  991.  moveq #0,d0
  992.  move.w (a0),d0
  993.  addq #4,a0
  994.  add.l START_OF_OBJECT,d0
  995.  move.l d0,a1
  996.  
  997. polylooSHAD:
  998.  
  999.  tst.w (a1)
  1000.  blt.s nomorepolysSHAD
  1001.  movem.l a0/a1/d7,-(a7)
  1002.  bsr doaSHADEpoly
  1003.  movem.l (a7)+,a0/a1/d7
  1004.  
  1005.  move.w (a1),d0
  1006.  lea 18(a1,d0.w*4),a1
  1007.  
  1008.  bra.s polylooSHAD
  1009. nomorepolysSHAD:
  1010.  sub.w #1,HIGHPOLY
  1011.  bra PartLoopSHAD
  1012. nomorepartsSHAD:
  1013.  
  1014. *******************************************
  1015. * Now the on-screen bit...
  1016. *******************************************
  1017.  
  1018.  move.l LinesPtr,a1
  1019.  move.l #PartBuffer,a0
  1020.  move.l a0,a2
  1021.  move.w #15,d0
  1022. clrpartbuff:
  1023.  move.l #$80000001,(a2)+
  1024.  move.l #$80000001,(a2)+
  1025.  move.l #$80000001,(a2)+
  1026.  move.l #$80000001,(a2)+
  1027.  dbra d0,clrpartbuff
  1028.  
  1029.  move.l #ROTATEDPTS,a2
  1030.  move.l OBJONOFF,d5
  1031.  
  1032.  moveq #0,d4
  1033.  
  1034.  tst.w SORTIT
  1035.  bne.s PutInParts
  1036.  
  1037. putinunsorted:
  1038.  move.w (a1)+,d7
  1039.  blt doneallparts
  1040.  lsr.l #1,d5
  1041.  bcs.s .yeson
  1042.  addq #2,a1
  1043.  bra putinunsorted
  1044. .yeson:
  1045.  
  1046.  move.w (a1)+,d6
  1047.  move.l #0,(a0)+
  1048.  move.w d7,(a0)+
  1049.  move.w d4,(a0)+
  1050.  
  1051.  addq #1,d4
  1052.  bra putinunsorted
  1053.  
  1054. PutInParts
  1055.  move.w (a1)+,d7
  1056.  blt doneallparts
  1057.  
  1058.  lsr.l #1,d5
  1059.  bcs.s .yeson
  1060.  addq #2,a1
  1061.  bra PutInParts
  1062. .yeson:
  1063.  
  1064.  move.w (a1)+,d6
  1065.  move.l (a2,d6.w),d0
  1066.  asr.l #8,d0
  1067.  asr.l #2,d0
  1068.  muls d0,d0
  1069.  move.l 4(a2,d6.w),d2
  1070.  asr.l #8,d2
  1071.  asr.l #2,d2
  1072.  muls d2,d2
  1073.  add.l d2,d0 
  1074.  move.w 8(a2,d6.w),d2
  1075.  add.w #1024,d2
  1076.  muls d2,d2
  1077.  add.l d2,d0
  1078.  
  1079.  move.l #PartBuffer-8,a0
  1080.  
  1081. stillfront
  1082.  addq #8,a0
  1083.  cmp.l (a0),d0
  1084.  blt stillfront
  1085.  move.l #endparttab-8,a5
  1086. domoreshift:
  1087.  move.l -8(a5),(a5)
  1088.  move.l -4(a5),4(a5)
  1089.  subq #8,a5
  1090.  cmp.l a0,a5
  1091.  bgt.s domoreshift
  1092.  
  1093.  move.l d0,(a0)
  1094.  move.w d7,4(a0)
  1095.  move.w d4,6(a0)
  1096.  addq #1,d4
  1097.  bra PutInParts
  1098.  
  1099. doneallparts:
  1100.  
  1101.  move.l #PartBuffer,a0
  1102.  
  1103. PartLoop
  1104.  move.l (a0)+,d7
  1105.  blt nomoreparts
  1106.  
  1107.  move.l #SAVEHIGHS,a2
  1108.  move.w 2(a0),d0
  1109.  move.w (a2,d0.w*2),HIGHPOLY
  1110.  
  1111.  moveq #0,d0
  1112.  move.w (a0),d0
  1113.  addq #4,a0
  1114.  add.l START_OF_OBJECT,d0
  1115.  move.l d0,a1
  1116.  
  1117. polyloo:
  1118.  
  1119.  tst.w (a1)
  1120.  blt.s nomorepolys
  1121.  movem.l a0/a1/d7,-(a7)
  1122.  bsr doapoly
  1123.  movem.l (a7)+,a0/a1/d7
  1124.  
  1125.  move.w (a1),d0
  1126.  lea 18(a1,d0.w*4),a1
  1127.  
  1128.  bra.s polyloo
  1129. nomorepolys:
  1130.  sub.w #1,HIGHPOLY
  1131.  bra PartLoop
  1132. nomoreparts:
  1133.  
  1134. NOPOLYS:
  1135.  
  1136. ; btst #6,$bfe001
  1137. ; beq.s .SHOWSHADOW
  1138.  
  1139.  move.l FASTBUFFER,a0
  1140.  add.l #40*320+64,a0
  1141.  move.l #RAWSCRN,a1
  1142.  add.l #40*40+8,a1
  1143.  move.l #(24)-1,d0
  1144.  move.l #175,d1
  1145.  move.w #128,d2
  1146.  move.w #16,d3
  1147.  moveq #0,d4
  1148.  moveq #0,d5
  1149.  jsr CHUNKYTOPLANAR 
  1150.  
  1151.  bra .SHOWNSCRN
  1152.  
  1153. .SHOWSHADOW
  1154.  
  1155.  move.l #SHADOWBUFFER,a0
  1156.  add.l #40*256,a0
  1157.  move.l #RAWSCRN,a1
  1158.  add.l #40*40,a1
  1159.  move.l #(256/8)-1,d0
  1160.  move.l #175,d1
  1161.  move.w #0,d2
  1162.  move.w #8,d3
  1163.  moveq #0,d4
  1164.  moveq #0,d5
  1165.  jsr CHUNKYTOPLANAR 
  1166.  
  1167. .SHOWNSCRN:
  1168.  
  1169.  move.l FASTBUFFER,a0
  1170.  move.l #NEBBIE,a1
  1171.  add.l #40*320+64,a0
  1172.  
  1173.  move.w #175,d0
  1174. clrchunk:
  1175.  move.l (a1)+,(a0)+
  1176.  move.l (a1)+,(a0)+
  1177.  move.l (a1)+,(a0)+
  1178.  move.l (a1)+,(a0)+
  1179.  move.l (a1)+,(a0)+
  1180.  move.l (a1)+,(a0)+
  1181.  move.l (a1)+,(a0)+
  1182.  move.l (a1)+,(a0)+
  1183.  move.l (a1)+,(a0)+
  1184.  move.l (a1)+,(a0)+
  1185.  move.l (a1)+,(a0)+
  1186.  move.l (a1)+,(a0)+
  1187.  move.l (a1)+,(a0)+
  1188.  move.l (a1)+,(a0)+
  1189.  move.l (a1)+,(a0)+
  1190.  move.l (a1)+,(a0)+
  1191.  move.l (a1)+,(a0)+
  1192.  move.l (a1)+,(a0)+
  1193.  move.l (a1)+,(a0)+
  1194.  move.l (a1)+,(a0)+
  1195.  move.l (a1)+,(a0)+
  1196.  move.l (a1)+,(a0)+
  1197.  move.l (a1)+,(a0)+
  1198.  move.l (a1)+,(a0)+
  1199.  move.l (a1)+,(a0)+
  1200.  move.l (a1)+,(a0)+
  1201.  move.l (a1)+,(a0)+
  1202.  move.l (a1)+,(a0)+
  1203.  move.l (a1)+,(a0)+
  1204.  move.l (a1)+,(a0)+
  1205.  move.l (a1)+,(a0)+
  1206.  move.l (a1)+,(a0)+
  1207.  move.l (a1)+,(a0)+
  1208.  move.l (a1)+,(a0)+
  1209.  move.l (a1)+,(a0)+
  1210.  move.l (a1)+,(a0)+
  1211.  move.l (a1)+,(a0)+
  1212.  move.l (a1)+,(a0)+
  1213.  move.l (a1)+,(a0)+
  1214.  move.l (a1)+,(a0)+
  1215.  move.l (a1)+,(a0)+
  1216.  move.l (a1)+,(a0)+
  1217.  move.l (a1)+,(a0)+
  1218.  move.l (a1)+,(a0)+
  1219.  move.l (a1)+,(a0)+
  1220.  move.l (a1)+,(a0)+
  1221.  move.l (a1)+,(a0)+
  1222.  move.l (a1)+,(a0)+
  1223.  add.w #(320-192),a0
  1224.  dbra d0,clrchunk
  1225.  
  1226.  move.l #SHADOWBUFFER,a0
  1227.  move.l #-1,d1
  1228.  move.l #-1,d2
  1229.  move.w #15,d0
  1230. ;clrshad:
  1231. ; move.w #15,d5
  1232. ;innner
  1233. ; move.l d2,(a0)+
  1234. ; move.l d2,(a0)+
  1235. ; move.l d2,(a0)+
  1236. ; move.l d2,(a0)+
  1237. ; move.l d1,(a0)+
  1238. ; move.l d1,(a0)+
  1239. ; move.l d1,(a0)+
  1240. ; move.l d1,(a0)+
  1241. ; move.l d2,(a0)+
  1242. ; move.l d2,(a0)+
  1243. ; move.l d2,(a0)+
  1244. ; move.l d2,(a0)+
  1245. ; move.l d1,(a0)+
  1246. ; move.l d1,(a0)+
  1247. ; move.l d1,(a0)+
  1248. ; move.l d1,(a0)+
  1249. ; move.l d2,(a0)+
  1250. ; move.l d2,(a0)+
  1251. ; move.l d2,(a0)+
  1252. ; move.l d2,(a0)+
  1253. ; move.l d1,(a0)+
  1254. ; move.l d1,(a0)+
  1255. ; move.l d1,(a0)+
  1256. ; move.l d1,(a0)+
  1257. ; move.l d2,(a0)+
  1258. ; move.l d2,(a0)+
  1259. ; move.l d2,(a0)+
  1260. ; move.l d2,(a0)+
  1261. ; move.l d1,(a0)+
  1262. ; move.l d1,(a0)+
  1263. ; move.l d1,(a0)+
  1264. ; move.l d1,(a0)+
  1265. ; move.l d2,(a0)+
  1266. ; move.l d2,(a0)+
  1267. ; move.l d2,(a0)+
  1268. ; move.l d2,(a0)+
  1269. ; move.l d1,(a0)+
  1270. ; move.l d1,(a0)+
  1271. ; move.l d1,(a0)+
  1272. ; move.l d1,(a0)+
  1273. ; move.l d2,(a0)+
  1274. ; move.l d2,(a0)+
  1275. ; move.l d2,(a0)+
  1276. ; move.l d2,(a0)+
  1277. ; move.l d1,(a0)+
  1278. ; move.l d1,(a0)+
  1279. ; move.l d1,(a0)+
  1280. ; move.l d1,(a0)+
  1281. ; move.l d2,(a0)+
  1282. ; move.l d2,(a0)+
  1283. ; move.l d2,(a0)+
  1284. ; move.l d2,(a0)+
  1285. ; move.l d1,(a0)+
  1286. ; move.l d1,(a0)+
  1287. ; move.l d1,(a0)+
  1288. ; move.l d1,(a0)+
  1289. ; move.l d2,(a0)+
  1290. ; move.l d2,(a0)+
  1291. ; move.l d2,(a0)+
  1292. ; move.l d2,(a0)+
  1293. ; move.l d1,(a0)+
  1294. ; move.l d1,(a0)+
  1295. ; move.l d1,(a0)+
  1296. ; move.l d1,(a0)+
  1297. ; dbra d5,innner
  1298. ; exg d1,d2
  1299. ;
  1300. ; dbra d0,clrshad
  1301.  
  1302.  
  1303.  
  1304.     btst #7,$bfe001
  1305.     beq.s exit_closescr
  1306.  
  1307.  
  1308.     add.l #$8000,lmxoff
  1309.     cmp.l #40*65536,lmxoff
  1310.     blt.s .oksm
  1311.     sub.l #40*65536,lmxoff    
  1312. .oksm
  1313.  
  1314.     bra loop
  1315.     
  1316. lmxoff: dc.l 0
  1317.  
  1318. exit_closescr
  1319.     move.l    MyScreen(pc),a0
  1320.     CALLINT CloseScreen
  1321.  
  1322. exit_closeall
  1323.     move.l    _GfxBase(pc),a1
  1324.     CALLEXEC CloseLibrary
  1325.  
  1326. exit_closeint
  1327.     move.l    _IntuitionBase(pc),a1
  1328.     CALLEXEC CloseLibrary
  1329.  
  1330. exit_false
  1331.     move.l    #0,d0                return code
  1332.     rts
  1333.  
  1334. TESTTAB: ds.w 30
  1335.  
  1336. ************************************************
  1337. * SUBROUTINES HERE. ****************************
  1338. ************************************************
  1339.  
  1340.  
  1341. **********************************************************
  1342.  
  1343. * the definition of the screen - note that in assembler you
  1344. * MUST get the sizes of these fields correct, by consulting either
  1345. * the RKM or the header files
  1346.  
  1347.  
  1348. MyNewScreen    dc.w    0,0        left, top
  1349.         dc.w    320,256        width, height
  1350.         dc.w    8        depth
  1351.         dc.b    0,1        pens
  1352.         dc.w    0        viewmodes
  1353.         dc.w    CUSTOMSCREEN    type
  1354.         dc.l    MyFont        font
  1355.         dc.l    screen_title    title
  1356.         dc.l    0        gadgets
  1357.         dc.l    0        bitmap
  1358.  
  1359. * my font definition
  1360. MyFont    dc.l    font_name
  1361.     dc.w    TOPAZ_SIXTY
  1362.     dc.b    FS_NORMAL
  1363.     dc.b    FPF_ROMFONT
  1364.  
  1365. * the variables
  1366. _IntuitionBase    dc.l    0        Intuition lib pointer
  1367. _GfxBase    dc.l    0        graphics lib pointer
  1368. MyScreen        dc.l    0
  1369. MyWindow        dc.l    0
  1370. MyNewWindow    ds.b    nw_SIZE        a buffer
  1371.  
  1372.  
  1373. * some strings
  1374. int_name    INTNAME
  1375. graf_name    GRAFNAME
  1376. hello_message    dc.b    'Hello World'
  1377.  
  1378. * these are C strings, so have to be null terminated
  1379. screen_title    dc.b    'My Own Screen',0
  1380. font_name    dc.b    'topaz.font',0
  1381. window_title    dc.b    'A Simple Window',0
  1382.  
  1383.  even
  1384.  
  1385.  
  1386. doaSHADEpoly:
  1387.  
  1388.  move.w (a1)+,d7    ; sides to draw
  1389.  addq #2,a1        ; avoid holes
  1390.  
  1391.  move.l #SHADOWPTS,a3
  1392.  
  1393.  move.w (a1),d0
  1394.  move.w 4(a1),d1
  1395.  move.w 8(a1),d2
  1396.  muls #10,d0
  1397.  muls #10,d1
  1398.  muls #10,d2
  1399.  move.w 8(a3,d0.w),d3
  1400.  move.w 8(a3,d1.w),d4
  1401.  move.w 8(a3,d2.w),d5
  1402.  move.l (a3,d0.w),d0
  1403.  move.l (a3,d1.w),d1
  1404.  move.l (a3,d2.w),d2
  1405.  asr.l #8,d0
  1406.  asr.l #8,d1
  1407.  asr.l #8,d2
  1408.  asr.l #1,d0
  1409.  asr.l #1,d1
  1410.  asr.l #1,d2
  1411.  
  1412.  sub.w d1,d0
  1413.  sub.w d1,d2
  1414.  sub.w d4,d3
  1415.  sub.w d4,d5
  1416.  muls d3,d2
  1417.  muls d5,d0
  1418.  sub.l d0,d2
  1419.  bge SHADpolybehind
  1420.  
  1421.  
  1422.  
  1423.  move.w #20000,d4    ; top
  1424.  move.w #-20000,d5    ; bottom
  1425.  move.l #UVCOORDS,a4
  1426.  
  1427. putinlinesSHAD:
  1428.  move.w (a1),d0
  1429.  move.w 4(a1),d1
  1430.  
  1431.  moveq #0,d2
  1432.  move.b 2(a1),d2    ; one end U
  1433.  move.w d2,2(a4,d0.w*4)
  1434.  move.b 3(a1),d2    ; one end V
  1435.  move.w d2,(a4,d0.w*4)
  1436.  move.b 6(a1),d2    ; two end U
  1437.  move.w d2,2(a4,d1.w*4)
  1438.  move.b 7(a1),d2    ; two end V
  1439.  move.w d2,(a4,d1.w*4)
  1440.  
  1441.  move.w d0,d2
  1442.  muls #10,d2
  1443.  move.w 8(a3,d2.w),d2    ; Z
  1444.  
  1445.  cmp.w d2,d4
  1446.  ble.s .oktop
  1447.  move.w d2,d4
  1448. .oktop
  1449.  cmp.w d2,d5
  1450.  bge.s .okbot
  1451.  move.w d2,d5
  1452. .okbot
  1453.  
  1454.  movem.l d4/d5/d7/a1/a3/a4,-(a7)
  1455.  bsr SIMPLESHADLINE
  1456.  movem.l (a7)+,d4/d5/d7/a1/a3/a4
  1457.  addq #4,a1
  1458.  dbra d7,putinlinesSHAD
  1459.  addq #4,a1
  1460.   
  1461.  move.w (a1)+,TEXTUREADD
  1462.  
  1463.  asr.w #2,d4
  1464.  asr.w #2,d5
  1465.  add.w #128,d4
  1466.  add.w #128,d5
  1467.  move.w d4,TOPLINE
  1468.  move.w d5,BOTLINE
  1469.  
  1470. * Now draw the shadow polygon....
  1471.  
  1472.  move.l #SHADOWBUFFER,a2
  1473.  move.l #LEFTUVS,a0
  1474.  move.w TOPLINE,d0
  1475.  move.w BOTLINE,d1
  1476.  sub.w d0,d1
  1477.  asl.w #3,d0
  1478.  add.w d0,a0
  1479.  muls #(512/8),d0
  1480.  add.l d0,a2    ; pointer to screen line.
  1481.  
  1482.  subq #1,d1
  1483.  blt NOPOLYGONSHAD
  1484.  
  1485. DOAHORLINESHAD:
  1486.  swap d1
  1487.  
  1488.  move.w RIGHTUVS-LEFTUVS(a0),d0
  1489.  move.w (a0)+,d7
  1490.  sub.w d7,d0
  1491.  blt NOPOLYGONSHAD
  1492.  
  1493.  move.l a2,-(a7)
  1494.  
  1495. ; asr.w #2,d0
  1496. ; asr.w #2,d7
  1497.  lea (a2,d7.w*2),a2
  1498.  ext.l d0
  1499.  addq #1,d0
  1500.  
  1501.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1502.  move.w (a0)+,d4
  1503.  swap d7
  1504.  clr.w d7
  1505.  swap d4
  1506.  clr.w d4
  1507.  sub.l d4,d7
  1508.  divs.l d0,d7
  1509.  move.l d7,a5
  1510.  
  1511.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1512.  swap d7
  1513.  clr.w d7
  1514.  move.w (a0)+,d5
  1515.  swap d5
  1516.  clr.w d5
  1517.  sub.l d5,d7
  1518.  divs.l d0,d7
  1519.  move.l d7,a6
  1520.  
  1521.  move.w RIGHTUVS-LEFTUVS(a0),d7
  1522.  swap d7
  1523.  clr.w d7
  1524.  move.w (a0)+,d6
  1525.  swap d6
  1526.  clr.w d6
  1527.  sub.l d6,d7
  1528.  divs.l d0,d7
  1529.  move.l d7,a3
  1530.  
  1531.  move.l a0,-(a7)
  1532.  move.l d1,-(a7)
  1533.  move.l #TEXTURES,a0
  1534.  move.w TEXTUREADD,d7
  1535.  bge.s .okaddtes3
  1536.  and.w #$7fff,d7
  1537.  add.l #65536*4,a0
  1538. .okaddtes3:
  1539.  ext.l d7
  1540. ; add.l d7,d7
  1541.  asl.l #8,d7
  1542.  add.l d7,a0
  1543.  move.w #0,d7
  1544.  
  1545.  subq #1,d0
  1546.  
  1547. ; d0=xdist
  1548. ; d4=U  a5=DU
  1549. ; d5=V  a6=DV
  1550. ; d6=Y  a3=DY
  1551.  moveq #0,d1
  1552.  
  1553.  swap d6
  1554.  
  1555. PLOTADOT:
  1556.  
  1557. .across
  1558.  
  1559. ; swap d4
  1560. ; swap d5
  1561. ; move.w d4,d2
  1562. ; lsl.w #8,d2
  1563. ; swap d4
  1564. ; move.b d5,d2
  1565. ; add.l a5,d4
  1566. ; swap d5
  1567. ; add.l a6,d5
  1568.  
  1569.  
  1570. ; swap d6
  1571. ; move.b (a2)+,d1
  1572. ; tst.b 1(a0,d2.w*8)
  1573. ; beq.s .noplottt
  1574.  move.b d6,(a2)
  1575.  addq #2,a2
  1576.  
  1577.  dbra d0,.across
  1578.  bra.s .plaster
  1579.  
  1580. .noplottt:
  1581.  addq #1,a2
  1582.  dbra d0,.across
  1583.  
  1584. .plaster:
  1585.  
  1586.  move.l (a7)+,d1
  1587.  move.l (a7)+,a0
  1588.  move.l (a7)+,a2
  1589.  
  1590. .noline:
  1591.  add.w #512,a2
  1592.  
  1593.  swap d1
  1594.  dbra d1,DOAHORLINESHAD
  1595.  
  1596. NOPOLYGONSHAD:
  1597.  
  1598. SHADpolybehind:
  1599.  rts
  1600.  
  1601.  
  1602. ************************************************
  1603.  
  1604. LU: dc.w 0
  1605. LV: dc.w 0
  1606. RU: dc.w 0
  1607. RV: dc.w 0
  1608.     
  1609. SIMPLESHADLINE:
  1610.  move.l #SHADOWPTS,a1
  1611.  
  1612.  move.l #UVCOORDS,a2
  1613.  move.w (a2,d0.w*4),LU
  1614.  move.w 2(a2,d0.w*4),LV
  1615.  move.w (a2,d1.w*4),RU
  1616.  move.w 2(a2,d1.w*4),RV
  1617.  
  1618.  muls #10,d0
  1619.  muls #10,d1
  1620.  move.w 8(a1,d0.w),d2        ;fz
  1621.  move.w 8(a1,d1.w),d7        ;sz
  1622.  ext.l d2
  1623.  ext.l d7
  1624.  
  1625.  move.l #LEFTUVS,a3
  1626.  asr.l #2,d2
  1627.  asr.l #2,d7
  1628.  cmp.l d2,d7 
  1629.  beq .noline
  1630.  
  1631.  bgt.s .lineonright
  1632. .lineonleft:
  1633.  move.l #RIGHTUVS,a3
  1634.  exg d0,d1
  1635.  exg d2,d7
  1636.  
  1637.  move.l LU,d5
  1638.  move.l RU,LU
  1639.  move.l d5,RU
  1640.  
  1641. .lineonright:
  1642.  
  1643.  sub.w d2,d7
  1644.  add.w #128,d2
  1645.  lea (a3,d2.w*8),a3
  1646.  
  1647.  move.w d7,YDIFF
  1648.  
  1649.  move.l (a1,d0.w),d3        ;fx
  1650.  move.l (a1,d1.w),d7        ;sx
  1651.  
  1652.  asl.l #5,d3
  1653.  asl.l #5,d7
  1654.  
  1655.  sub.l d3,d7
  1656.  divs.l YDIFF-2,d7
  1657.  move.l d7,a0    ; dx
  1658.  
  1659.  move.l #ROTATEDPTS,a1
  1660.  
  1661.  move.w LU,d4
  1662.  move.w LV,d5
  1663.  move.w RU,d6
  1664.  move.w RV,d7
  1665.  
  1666.  sub.w d4,d6
  1667.  sub.w d5,d7
  1668.  swap d4
  1669.  swap d5
  1670.  clr.w d4
  1671.  clr.w d5
  1672.  swap d6
  1673.  swap d7
  1674.  clr.w d6
  1675.  clr.w d7
  1676.  
  1677.  divs.l YDIFF-2,d6
  1678.  divs.l YDIFF-2,d7
  1679.  
  1680.  move.l d6,a4
  1681.  move.l d7,a5
  1682.  
  1683. ; asl.w #4,d0
  1684. ; asl.w #4,d1
  1685.  
  1686.  move.l 4(a1,d0.w),d6
  1687.  move.l 4(a1,d1.w),d7
  1688.  asl.l #5,d6
  1689.  asl.l #5,d7
  1690.  sub.l d6,d7
  1691.  divs.l YDIFF-2,d7
  1692.  exg d7,a6
  1693.  exg d7,d6
  1694.  
  1695.  move.l YDIFF-2,d1
  1696.  subq #1,d1
  1697.  
  1698. ; d3=x a0=dx
  1699. ; d4=u a4=du
  1700. ; d5=v a5=dv
  1701. ; d7=y a6=dy
  1702. ; d1=dz
  1703.  
  1704.  move.w HIGHPOLY,d7
  1705.  
  1706.  add.l #128*65536,d3
  1707. ; add.l #128*65536,d7
  1708.  
  1709. .PUTINLINE:
  1710.  swap d3
  1711.  move.w d3,(a3)+
  1712.  swap d3
  1713.  add.l a0,d3
  1714.  swap d4
  1715.  move.w d4,(a3)+
  1716.  swap d4
  1717.  swap d5
  1718.  add.l a4,d4
  1719.  move.w d5,(a3)+
  1720.  swap d5
  1721.  add.l a5,d5
  1722. ; swap d7
  1723.  move.w d7,(a3)+
  1724. ; swap d7
  1725. ; add.l a6,d7
  1726.  dbra d1,.PUTINLINE
  1727.  
  1728. .noline:
  1729.  rts
  1730.  
  1731. BCOS: dc.w 0
  1732. BSIN: dc.w 0
  1733. ACOS: dc.w 0
  1734. ASIN: dc.w 0
  1735. FSX: dc.w 0
  1736. FSY: dc.w 0
  1737. SSX: dc.w 0
  1738. SSY: dc.w 0
  1739.  
  1740. **************************************************
  1741.  
  1742. doapoly:
  1743.  
  1744.  move.w (a1)+,d7    ; sides to draw
  1745.  addq #2,a1        ; avoid holes
  1746.  move.w 12(a1,d7.w*4),pregour
  1747.  
  1748.  move.l #ONSCREENPTS,a3
  1749.  
  1750.  move.w (a1),d0
  1751.  move.w 4(a1),d1
  1752.  move.w 8(a1),d2
  1753.  move.w 2(a3,d0.w*4),d3
  1754.  move.w 2(a3,d1.w*4),d4
  1755.  move.w 2(a3,d2.w*4),d5
  1756.  move.w (a3,d0.w*4),d0
  1757.  move.w (a3,d1.w*4),d1
  1758.  move.w (a3,d2.w*4),d2
  1759.  
  1760.  sub.w d1,d0
  1761.  sub.w d1,d2
  1762.  sub.w d4,d3
  1763.  sub.w d4,d5
  1764.  muls d3,d2
  1765.  muls d5,d0
  1766.  sub.l d0,d2
  1767.  ble polybehind
  1768.  
  1769. ; Now we must rotate the polygons coordinates in
  1770. ; the specular map so that the texturemap is vertical
  1771. ; relative to the specular map and so that bump-
  1772. ; mapping can take place unerroneously!
  1773.  
  1774. ; movem.l d0-d7/a0-a6,-(a7)
  1775.  
  1776.  move.w #0,BCOS
  1777.  move.w #128*128,ACOS
  1778.  move.w #0,BSIN
  1779.  move.w #0,ASIN
  1780.  
  1781. ; bra .NOROT
  1782.  
  1783. ; First calculate angle B
  1784.  
  1785.  move.l #SPECBRIGHTS,a3
  1786.  
  1787.  move.w (a1),d0
  1788.  moveq #0,d5
  1789.  moveq #0,d6
  1790.  move.b (a3,d0.w*4),d5
  1791.  move.b 1(a3,d0.w*4),d6
  1792.  move.w 4(a1),d0
  1793.  moveq #0,d3
  1794.  moveq #0,d4
  1795.  move.b (a3,d0.w*4),d3
  1796.  move.b 1(a3,d0.w*4),d4
  1797.  sub.w d5,d3
  1798.  sub.w d6,d4
  1799.  
  1800.  move.w d3,d1
  1801.  move.w d4,d2
  1802.  muls d1,d1
  1803.  muls d2,d2
  1804.  add.l d1,d2
  1805.  jsr CALCSQROOT
  1806.  tst.w d2
  1807.  beq .NOROT
  1808.  
  1809.  ext.l d3
  1810.  asl.l #7,d3
  1811.  ext.l d4
  1812.  asl.l #7,d4
  1813.  divs d2,d3
  1814.  divs d2,d4
  1815.  move.w d3,BCOS
  1816.  neg.w d4
  1817.  move.w d4,BSIN
  1818.  
  1819.  moveq #0,d3
  1820.  move.b 2(a1),d3
  1821.  moveq #0,d4
  1822.  move.b 3(a1),d4
  1823.  moveq #0,d5
  1824.  move.b 2+4(a1),d5
  1825.  moveq #0,d6
  1826.  move.b 3+4(a1),d6
  1827.  
  1828.  sub.w d3,d5
  1829.  sub.w d4,d6
  1830.  
  1831.  move.w d5,d1
  1832.  move.w d6,d2
  1833.  muls d1,d1
  1834.  muls d2,d2
  1835.  add.l d1,d2
  1836.  jsr CALCSQROOT
  1837.  tst.w d2
  1838.  beq.s .NOROT
  1839.  
  1840.  ext.l d5
  1841.  ext.l d6
  1842.  asl.l #7,d5
  1843.  asl.l #7,d6
  1844.  divs d2,d5
  1845.  divs d2,d6
  1846.  move.w d5,ACOS
  1847.  neg.w d6
  1848.  move.w d6,ASIN
  1849.  
  1850.  move.w ACOS,d4
  1851.  move.w ASIN,d5
  1852.  move.w d4,d2
  1853.  move.w d5,d3
  1854.  muls BCOS,d2
  1855.  muls BSIN,d3
  1856.  sub.l d3,d2
  1857.  muls BSIN,d4
  1858.  muls BCOS,d5
  1859.  add.l d5,d4
  1860.  move.w d2,ACOS
  1861.  move.w d4,ASIN
  1862.  
  1863. .NOROT:
  1864. ; movem.l (a7)+,d0-d7/a0-a6
  1865.  
  1866.  move.l #ONSCREENPTS,a3
  1867.  
  1868.  move.w #20000,d4    ; top
  1869.  move.w #-20000,d5    ; bottom
  1870.  move.l #UVCOORDS,a4
  1871.  
  1872.  move.l a1,a0
  1873.  
  1874. putinlines:
  1875.  move.w (a1),d0
  1876.  move.w 4(a1),d1
  1877.  
  1878.  moveq #0,d2
  1879.  move.b 2(a1),d2    ; one end U
  1880.  move.w d2,2(a4,d0.w*4)
  1881.  move.b 3(a1),d2    ; one end V
  1882.  move.w d2,(a4,d0.w*4)
  1883.  move.b 6(a1),d2    ; two end U
  1884.  move.w d2,2(a4,d1.w*4)
  1885.  move.b 7(a1),d2    ; two end V
  1886.  move.w d2,(a4,d1.w*4)
  1887.  
  1888.  move.w 2(a3,d0.w*4),d2    ; Z
  1889.  
  1890.  cmp.w d2,d4
  1891.  ble.s .oktop
  1892.  move.w d2,d4
  1893. .oktop
  1894.  cmp.w d2,d5
  1895.  bge.s .okbot
  1896.  move.w d2,d5
  1897. .okbot
  1898.  
  1899.  movem.l a0/d4/d5/d7/a1/a3/a4,-(a7)
  1900.  jsr SIMPLECALCLINE
  1901.  movem.l (a7)+,a0/d4/d5/d7/a1/a3/a4
  1902.  addq #4,a1
  1903.  dbra d7,putinlines
  1904.  addq #4,a1 
  1905.  
  1906.  move.w (a1)+,TEXTUREADD
  1907.  
  1908.  asr.w #2,d4
  1909.  asr.w #2,d5
  1910. ; add.w #128,d4
  1911. ; add.w #128,d5
  1912.  move.w d4,TOPLINE
  1913.  move.w d5,BOTLINE
  1914.   
  1915.  move.l #SHADOWPTS,a1
  1916.  move.w (a0),d0
  1917.  move.w 4(a0),d1
  1918.  move.w 8(a0),d2
  1919.  
  1920. CHECKVALS:
  1921.  
  1922.  muls #10,d0
  1923.  muls #10,d1
  1924.  muls #10,d2
  1925.  
  1926.  lea (a1,d0.w),a0
  1927.  lea (a1,d2.w),a2
  1928.  lea (a1,d1.w),a1
  1929.  
  1930.  move.l (a0),d3
  1931.  sub.l (a1),d3
  1932.  asr.l #8,d3
  1933.  asr.l #1,d3
  1934.  move.l 4(a0),d4
  1935.  sub.l 4(a1),d4
  1936.  asr.l #8,d4
  1937.  asr.l #1,d4
  1938.  move.w 8(a0),d5
  1939.  sub.w 8(a1),d5
  1940.  
  1941.  move.w d3,d6
  1942.  muls d6,d6
  1943.  move.w d4,d7
  1944.  muls d7,d7
  1945.  add.l d7,d6
  1946.  move.w d5,d7
  1947.  muls d7,d7
  1948.  add.l d7,d6
  1949.  move.l d6,d2
  1950.  jsr CALCSQROOT
  1951.  move.w d2,LEN1
  1952.  
  1953.  move.l (a2),d0
  1954.  sub.l (a1),d0
  1955.  asr.l #8,d0
  1956.  asr.l #1,d0
  1957.  move.l 4(a2),d1
  1958.  sub.l 4(a1),d1
  1959.  asr.l #8,d1
  1960.  asr.l #1,d1
  1961.  move.w 8(a2),d2
  1962.  sub.w 8(a1),d2
  1963.  
  1964.  muls d2,d3
  1965.  muls d0,d5
  1966.  sub.l d3,d5    ; length
  1967.  muls.l #$4c,d5
  1968.  
  1969.  muls d0,d0
  1970.  muls d1,d1
  1971.  muls d2,d2
  1972.  add.l d0,d1
  1973.  add.l d1,d2
  1974.  jsr CALCSQROOT
  1975.  
  1976.  muls LEN1,d2
  1977.  bgt.s .ok
  1978.  moveq #1,d2
  1979. .ok
  1980.  
  1981.  divs.l d2,d5
  1982.  
  1983.  add.l #16,d5
  1984.  
  1985.  tst.l d5
  1986.  ble.s .okbr
  1987.  moveq #0,d5
  1988. .okbr:
  1989.  add.w #$5c,d5
  1990.  bge.s .okbr2
  1991.  moveq #0,d5
  1992. .okbr2:
  1993.  
  1994.  move.w d5,d0
  1995.  
  1996.  asl.w #8,d5
  1997.  move.w d5,BRIGHTNESS+2
  1998.  
  1999.  sub.w #$5c,d0
  2000.  asr.w #1,d0
  2001.  add.w #$5c,d0
  2002.  asl.w #8,d0
  2003.  move.w d0,BRIGHTNESS
  2004.  
  2005.  
  2006. ***********************************************
  2007. * Draw the polygon (shadowed).
  2008.  
  2009.  move.l FASTBUFFER,a2
  2010.  move.l #LEFTUVS,a0
  2011.  move.w TOPLINE,d0
  2012.  move.w BOTLINE,d1
  2013.  sub.w d0,d1
  2014.  asl.w #4,d0
  2015.  add.w d0,a0
  2016.  muls #(320/16),d0
  2017.  add.l d0,a2    ; pointer to screen line.
  2018.  
  2019.  subq #1,d1
  2020.  blt NOPOLYGON
  2021.  
  2022.  tst.b Gouraud
  2023.  bne GOURPOLY
  2024.  
  2025. DOAHORLINE:
  2026.  swap d1
  2027.  
  2028.  move.w RIGHTUVS-LEFTUVS(a0),d0
  2029.  move.w (a0)+,d7
  2030.  asr.w #2,d0
  2031.  asr.w #2,d7
  2032.  sub.w d7,d0
  2033.  bge.s .okflibble
  2034.  
  2035.  add.w #14,a0
  2036.  add.w #320,a2
  2037.  swap d1
  2038.  dbra d1,DOAHORLINE
  2039.  bra NOPOLYGON
  2040.  
  2041. .okflibble:
  2042.  
  2043.  move.l a2,-(a7)
  2044.  
  2045.  add.w d7,a2
  2046.  ext.l d0
  2047.  addq #1,d0
  2048.  
  2049.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2050.  move.l (a0)+,d2 
  2051.  sub.l d2,d7
  2052.  divs.l d0,d7
  2053.  move.l d7,a1
  2054.  
  2055.  
  2056.  
  2057.  
  2058.  
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  move.l RIGHTUVS-LEFTUVS(a0),d7 
  2073.  move.l (a0)+,d3 
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  sub.l d3,d7
  2095.  divs.l d0,d7
  2096.  move.l d7,a4
  2097.  
  2098.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2099.  move.w (a0)+,d4
  2100.  swap d7
  2101.  clr.w d7
  2102.  swap d4
  2103.  clr.w d4
  2104.  sub.l d4,d7
  2105.  divs.l d0,d7
  2106.  move.l d7,a5
  2107.  
  2108.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2109.  swap d7
  2110.  clr.w d7
  2111.  move.w (a0)+,d5
  2112.  swap d5
  2113.  clr.w d5
  2114.  sub.l d5,d7
  2115.  divs.l d0,d7
  2116.  move.l d7,a6
  2117.  
  2118.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2119.  swap d7
  2120.  clr.w d7
  2121.  move.w (a0)+,d6
  2122.  swap d6
  2123.  clr.w d6
  2124.  sub.l d6,d7
  2125.  divs.l d0,d7
  2126.  move.l d7,a3
  2127.  
  2128.  move.l a0,-(a7)
  2129.  move.l d1,-(a7)
  2130.  move.l #TEXTURES,a0
  2131.  move.w TEXTUREADD,d7
  2132.  bge.s .okaddtes3
  2133.  and.w #$7fff,d7
  2134.  add.l #65536*4,a0
  2135. .okaddtes3:
  2136.  ext.l d7
  2137. ; add.l d7,d7
  2138.  asl.l #8,d7
  2139.  add.l d7,a0
  2140.  move.w #0,d7
  2141.  
  2142.  move.l BRIGHTNESS,a6
  2143.  
  2144.  move.l a7,SAVESTACK
  2145.  move.l #SHADOWBUFFER,a7
  2146.  
  2147.  subq #1,d0
  2148.  
  2149. ; d0=xdist
  2150. ; d2=U    a1=DU
  2151. ; d3=V  a4=DV
  2152. ; d4=X  a5=DX
  2153. ; d5=Y  a6=DY
  2154. ; d6=Z  a3=DZ
  2155.  move.w HIGHPOLY,d5
  2156.  
  2157.  moveq #0,d1
  2158.  swap d6
  2159.  move.w d6,d1
  2160.  lsl.w #8,d1
  2161.  swap d4
  2162.  move.b d4,d1
  2163.  swap d4
  2164.  swap d6
  2165.  
  2166.  moveq #0,d7
  2167.  move.b (a7,d1.l),d7
  2168.  cmp.w d7,d5
  2169.  ble INTHELIGHT
  2170.  bra.s INTHEDARK
  2171.  
  2172. PENUMBRA:
  2173.  moveq #0,d1
  2174.  swap d6
  2175.  move.w d6,d1
  2176.  lsl.w #8,d1
  2177.  swap d4
  2178.  move.b d4,d1
  2179.  swap d4
  2180.  swap d6
  2181.  add.l a5,d4
  2182.  add.l a3,d6
  2183.  
  2184.      moveq #0,d7
  2185.  move.b (a7,d1.l),d7
  2186.  cmp.w d7,d5
  2187.  ble INTOLIGHT
  2188.  bra.s INTODARK
  2189.  
  2190.  
  2191. INTHEDARK:
  2192.  moveq #0,d1
  2193.  swap d6
  2194.  move.w d6,d1
  2195.  lsl.w #8,d1
  2196.  swap d4
  2197.  move.b d4,d1
  2198.  swap d4
  2199.  swap d6
  2200.  add.l a5,d4
  2201.  add.l a3,d6
  2202.  
  2203.  moveq #0,d7
  2204.  move.b (a7,d1.l),d7
  2205.  cmp.w d7,d5
  2206.  ble.s INTOPENUM
  2207. INTODARK:
  2208.  move.w #$5c00,d7
  2209.  swap d2
  2210.  move.w d2,d1
  2211.  asl.w #8,d1
  2212.  swap d3
  2213.  move.b d3,d1
  2214.  swap d2
  2215.  swap d3
  2216.  add.l a1,d2
  2217.  add.l a4,d3
  2218.  
  2219. ; move.b (a0,d1.w*4),d7
  2220. ; beq.s .noplottt
  2221.  
  2222.  move.b TEXTUREPAL-256(pc,d7.w),(a2)+
  2223.  dbra d0,INTHEDARK
  2224.  bra.s PASTAC 
  2225.  
  2226. .noplottt
  2227.  addq #1,a2
  2228.  dbra d0,INTHEDARK
  2229.  bra.s PASTAC
  2230.  
  2231. INTOPENUM:
  2232.  move.l a6,d7
  2233.  swap d7
  2234.  swap d2
  2235.  move.w d2,d1
  2236.  asl.w #8,d1
  2237.  swap d3
  2238.  move.b d3,d1
  2239.  swap d2
  2240.  swap d3
  2241.  add.l a1,d2
  2242.  add.l a4,d3
  2243.  
  2244. ; move.b (a0,d1.w*4),d7
  2245. ; beq.s .noplottt
  2246.  
  2247.  move.b TEXTUREPAL(pc,d7.w),(a2)+
  2248.  dbra d0,PENUMBRA
  2249.  bra.s PASTAC 
  2250.  
  2251. .noplottt
  2252.  addq #1,a2
  2253.  dbra d0,PENUMBRA
  2254.  bra.s PASTAC
  2255.  
  2256. INTHELIGHT:
  2257.  
  2258.  moveq #0,d1
  2259.  swap d6
  2260.  move.w d6,d1
  2261.  lsl.w #8,d1
  2262.  swap d4
  2263.  move.b d4,d1
  2264.  swap d4
  2265.  swap d6
  2266.  add.l a5,d4
  2267.  add.l a3,d6
  2268.  
  2269.  moveq #0,d7
  2270.  move.b (a7,d1.l),d7
  2271.  cmp.w d7,d5
  2272.  bgt.s INTOPENUM
  2273. INTOLIGHT:
  2274.  move.w a6,d7
  2275.  swap d2
  2276.  move.w d2,d1
  2277.  asl.w #8,d1
  2278.  swap d3
  2279.  move.b d3,d1
  2280.  swap d2
  2281.  swap d3
  2282.  add.l a1,d2
  2283.  add.l a4,d3
  2284.  
  2285. ; move.b (a0,d1.w*4),d7
  2286. ; beq.s .noplottt
  2287.  
  2288.  move.b TEXTUREPAL(pc,d7.w),(a2)+
  2289.  dbra d0,INTHELIGHT
  2290.  bra.s PASTAC 
  2291.  
  2292. .noplottt:
  2293.  addq #1,a2
  2294.  dbra d0,INTHELIGHT
  2295.  
  2296. PASTAC
  2297.  
  2298.  move.l SAVESTACK,a7
  2299.  
  2300.  move.l (a7)+,d1
  2301.  move.l (a7)+,a0
  2302.  move.l (a7)+,a2
  2303.  
  2304. .noline:
  2305.  add.w #320,a2
  2306.  
  2307.  swap d1
  2308.  dbra d1,DOAHORLINE
  2309.  
  2310. NOPOLYGON:
  2311. polybehind:
  2312.  rts
  2313.  
  2314. TEXTUREPAL:
  2315.  
  2316. SAVESTACK: dc.l 0
  2317. HIGHPOLY: dc.w 0
  2318. LEN1: dc.w 0
  2319. BRIGHTNESS: dc.l 0
  2320. TRANSTEXT: dc.w 0
  2321. AANG: dc.w 0
  2322. BANG: dc.w 0
  2323. CANG: dc.w 0
  2324. DANG: dc.w 0
  2325.  
  2326.  
  2327.  
  2328. GOURPOLY: 
  2329.  
  2330. DOAHORLINEGOUR:
  2331.  swap d1
  2332.  
  2333.  move.w RIGHTUVS-LEFTUVS(a0),d0
  2334.  move.w (a0)+,d7
  2335.  asr.w #2,d0
  2336.  asr.w #2,d7
  2337.  sub.w d7,d0
  2338.  bge.s .okflibble
  2339.  
  2340.  add.w #14,a0
  2341.  add.w #320,a2
  2342.  swap d1
  2343.  dbra d1,DOAHORLINEGOUR
  2344.  bra NOPOLYGON
  2345.  
  2346. .okflibble:
  2347.  
  2348.  move.l a2,-(a7)
  2349.  
  2350.  add.w d7,a2
  2351.  ext.l d0
  2352.  addq #1,d0
  2353.  
  2354.  move.b RIGHTUVS-LEFTUVS(a0),d3
  2355.  move.b (a0),d2
  2356.  ext.w d3
  2357.  ext.w d2
  2358.  
  2359.  tst.w d2
  2360.  blt .bothtowards
  2361.  
  2362. ; bgt .firstaway
  2363.  tst.w d3
  2364.  blt .bothtowards
  2365.  bra .bothaway
  2366.  
  2367. .firsttowards:
  2368.  tst.w d3
  2369.  ble .bothtowards
  2370.  
  2371. ; First is towards and second away...
  2372.  
  2373.  move.w d0,d7    ; total length
  2374.  move.w d0,d6
  2375.  neg.w d2
  2376.  add.w d2,d3
  2377.  muls d2,d6
  2378.  divs d3,d6    ; length of first bit
  2379.  sub.w d6,d7    ; length of second bit
  2380.  move.w d6,FIRSTLEN
  2381.  move.w d7,LASTLEN
  2382.  
  2383.  tst.w FIRSTLEN
  2384.  beq .bothaway
  2385.  tst.w LASTLEN
  2386.  beq .bothtowards
  2387.  
  2388.  moveq #0,d2
  2389.  moveq #0,d3
  2390.  moveq #0,d4
  2391.  moveq #0,d5
  2392.  move.b 6(a0),d2
  2393.  move.b 7(a0),d3
  2394.  
  2395.  move.w d2,FIRSTU
  2396.  move.w d3,FIRSTV
  2397.  
  2398.  move.w d2,d4
  2399.  move.w d3,d5
  2400.  sub.w #128,d2
  2401.  sub.w #128,d3
  2402.  muls d2,d2
  2403.  muls d3,d3
  2404.  add.l d3,d2
  2405.  jsr CALCSQROOT
  2406.  
  2407.  tst.w d2
  2408.  beq.s .nochng
  2409.  
  2410.  sub.w #128,d4
  2411.  sub.w #128,d5
  2412.  muls #127,d4
  2413.  muls #127,d5
  2414.  divs d2,d4
  2415.  divs d2,d5
  2416.  add.w #128,d4
  2417.  add.w #128,d5
  2418.  
  2419. .nochng:
  2420.  
  2421.  move.w d4,MIDU
  2422.  move.w d5,MIDV
  2423.  
  2424.  move.b 6+RIGHTUVS-LEFTUVS(a0),d4
  2425.  move.b 7+RIGHTUVS-LEFTUVS(a0),d5
  2426.  move.w d4,SECU
  2427.  move.w d5,SECV
  2428.  
  2429.  move.w d4,d2
  2430.  move.w d5,d3
  2431.  
  2432.  sub.w #128,d2
  2433.  sub.w #128,d3
  2434.  muls d2,d2
  2435.  muls d3,d3
  2436.  add.l d3,d2
  2437.  jsr CALCSQROOT
  2438.  
  2439.  tst.w d2
  2440.  beq.s .nochng2
  2441.  
  2442.  sub.w #128,d4
  2443.  sub.w #128,d5
  2444.  muls #127,d4
  2445.  muls #127,d5
  2446.  divs d2,d4
  2447.  divs d2,d5
  2448.  add.w #128,d4
  2449.  add.w #128,d5
  2450.  
  2451. .nochng2:
  2452.  
  2453.  add.w MIDU,d4
  2454.  add.w MIDV,d5
  2455.  asr.w #1,d4
  2456.  asr.w #1,d5
  2457.  move.w d4,MIDU
  2458.  move.w d5,MIDV 
  2459.  
  2460.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2461.  move.l (a0)+,d2 
  2462.  
  2463.  and.l #$ffffff,d2
  2464.  and.l #$ffffff,d7
  2465.  
  2466.  moveq #0,d3
  2467.  moveq #0,d5
  2468.  move.w d2,d3
  2469.  move.w d7,d5
  2470.  swap d3
  2471.  swap d5
  2472.  sub.l d3,d5
  2473.  divs.l d0,d5
  2474.  asr.l #8,d5
  2475.  move.w d5,RIGHTBRIGHT
  2476.  asr.l #8,d3
  2477.  move.w d3,LEFTBRIGHT
  2478.  
  2479.  clr.w d2
  2480.  clr.w d7
  2481.  sub.l d2,d7
  2482.  asl.l #8,d2
  2483.  divs.l d0,d7
  2484.  asl.l #8,d7
  2485.  
  2486.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  2487.  move.l (a0)+,d3
  2488.  
  2489.  moveq #0,d4
  2490.  moveq #0,d5
  2491.  
  2492. ; move.w d6,d5
  2493. ; move.w d3,d4
  2494. ; move.b #0,d4
  2495. ; move.b #0,d5
  2496.  
  2497.  move.w FIRSTU,d4
  2498.  move.w MIDU,d5
  2499.  lsl.l #8,d4
  2500.  lsl.l #8,d5
  2501.  
  2502.  sub.l d4,d5
  2503.  divs.l FIRSTLEN-2,d5
  2504.  
  2505.  move.w d4,d2
  2506.  move.w d5,d7
  2507.  move.l d7,a1
  2508.  moveq #0,d4
  2509.  moveq #0,d5
  2510.  
  2511. ; move.b d6,d5
  2512. ; move.b d3,d4
  2513.  
  2514. ; swap d5
  2515. ; swap d4
  2516.  
  2517.  move.w FIRSTV,d4
  2518.  move.w MIDV,d5
  2519.  swap d4
  2520.  swap d5
  2521.  
  2522.  sub.l d4,d5
  2523.  divs.l FIRSTLEN-2,d5
  2524.  
  2525.  move.l d5,a3
  2526.  move.l d4,d5
  2527.   
  2528.  clr.w d3
  2529.  clr.w d6
  2530.  sub.l d3,d6
  2531.  divs.l d0,d6
  2532.  move.l d6,a4
  2533.  
  2534.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2535.  move.w (a0)+,d4
  2536.  swap d7
  2537.  clr.w d7
  2538.  swap d4
  2539.  clr.w d4
  2540.  sub.l d4,d7
  2541.  divs.l d0,d7
  2542.  move.l d7,a5
  2543.  
  2544. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  2545. ; swap d7
  2546. ; clr.w d7
  2547.  move.w (a0)+,d7
  2548. ; swap d5
  2549. ; clr.w d5
  2550. ; sub.l d5,d7
  2551. ; divs.l d0,d7
  2552. ; move.l d7,a6
  2553.  
  2554.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2555.  swap d7
  2556.  clr.w d7
  2557.  move.w (a0)+,d6
  2558.  swap d6
  2559.  clr.w d6
  2560.  sub.l d6,d7
  2561.  divs.l d0,d7
  2562.  
  2563.  lsl.l #8,d6
  2564.  lsl.l #8,d7
  2565.  
  2566.  move.w RIGHTBRIGHT,d7
  2567.  move.l d7,a6
  2568.  
  2569.  move.l a0,-(a7)
  2570.  move.l d1,-(a7)
  2571.  move.l #TEXTURES,a0
  2572.  move.w TEXTUREADD,d7
  2573.  bge.s .okaddtes3
  2574.  and.w #$7fff,d7
  2575.  add.l #65536*4,a0
  2576. .okaddtes3:
  2577.  ext.l d7
  2578. ; add.l d7,d7
  2579.  asl.l #8,d7
  2580.  add.l d7,a0
  2581.  move.w #0,d7
  2582.  
  2583.  move.w LEFTBRIGHT,d6
  2584.  
  2585.  subq #1,d0
  2586.  swap d0
  2587.  move.w HIGHPOLY,d0
  2588.  swap d0
  2589.  
  2590.  
  2591. ; d0=xdist
  2592. ; d2=U    a1=DU
  2593. ; d3=V  a4=DV
  2594. ; d4=X  a5=DX
  2595. ; d5=Y  a6=DY
  2596. ; d6=Z  a3=DZ
  2597.  
  2598. ; d0= polynum : polynum : counter : counter
  2599. ; d1= scratch : scratch : scratch : scratch
  2600. ; d2= u : uacc : sv : svacc
  2601. ; d3= v : v : vacc : vacc
  2602. ; d4= x : x : xacc : xacc
  2603. ; d5= su : su : suacc : suacc
  2604. ; d6= z : zacc : bright : brightacc
  2605. ; d7= scratch : scratch : scratch : scratch
  2606.  
  2607. ; a0= textures
  2608. ; a1= uspeed : uspeed : suspeed : suspeed
  2609. ; a2= screen pointer
  2610. ; a3= svspeed : svspeed : svspeed : svspeed
  2611. ; a4= vspeed : vspeed : vspeed : vspeed
  2612. ; a5= xspeed : xspeed : xspeed : xspeed
  2613. ; a6= zspeed : zspeed :brightspeed : brightspeed
  2614. ; a7= shadowmap pointer
  2615.  
  2616.  
  2617.  move.w FIRSTLEN,d0
  2618.  sub.w #1,d0
  2619.  bsr STARTLINE
  2620.  
  2621.  move.l #0,d5
  2622.  move.w #0,d2
  2623.  move.l #0,a3
  2624.  
  2625.  move.w LASTLEN,d0
  2626.  sub.w #1,d0
  2627.  
  2628.  bsr STARTLINE
  2629.  
  2630.  
  2631.  move.l (a7)+,d1
  2632.  move.l (a7)+,a0
  2633.  move.l (a7)+,a2
  2634.  
  2635.  bra .noline
  2636.  
  2637. .firstaway:
  2638.  tst.w d3
  2639.  bge .bothaway
  2640.  
  2641.  
  2642. ; first is away and second is towards...
  2643.  
  2644. ; this really isn't going to work...
  2645.  
  2646.  move.w d0,d7    ; total length
  2647.  move.w d0,d6
  2648.  neg.w d3
  2649.  add.w d2,d3
  2650.  muls d2,d6
  2651.  divs d3,d6    ; length of first bit
  2652.  sub.w d6,d7    ; length of second bit
  2653.  move.w d6,FIRSTLEN
  2654.  move.w d7,LASTLEN
  2655.  
  2656.  tst.w FIRSTLEN
  2657.  beq .bothaway
  2658.  tst.w LASTLEN
  2659.  beq .bothtowards
  2660.  
  2661.  moveq #0,d2
  2662.  moveq #0,d3
  2663.  moveq #0,d4
  2664.  moveq #0,d5
  2665.  move.b 6(a0),d2
  2666.  move.b 7(a0),d3
  2667.  
  2668.  move.w d2,FIRSTU
  2669.  move.w d3,FIRSTV
  2670.  
  2671.  move.w d2,d4
  2672.  move.w d3,d5
  2673.  sub.w #128,d2
  2674.  sub.w #128,d3
  2675.  muls d2,d2
  2676.  muls d3,d3
  2677.  add.l d3,d2
  2678.  jsr CALCSQROOT
  2679.  
  2680.  tst.w d2
  2681.  beq.s .nochng22
  2682.  
  2683.  sub.w #128,d4
  2684.  sub.w #128,d5
  2685.  muls #127,d4
  2686.  muls #127,d5
  2687.  divs d2,d4
  2688.  divs d2,d5
  2689.  add.w #128,d4
  2690.  add.w #128,d5
  2691.  
  2692. .nochng22:
  2693.  
  2694.  move.w d4,MIDU
  2695.  move.w d5,MIDV
  2696.  
  2697.  moveq #0,d4
  2698.  moveq #0,d5
  2699.  move.b 6+RIGHTUVS-LEFTUVS(a0),d4
  2700.  move.b 7+RIGHTUVS-LEFTUVS(a0),d5
  2701.  move.w d4,SECU
  2702.  move.w d5,SECV
  2703.  
  2704.  move.w d4,d2
  2705.  move.w d5,d3
  2706.  
  2707.  sub.w #128,d2
  2708.  sub.w #128,d3
  2709.  muls d2,d2
  2710.  muls d3,d3
  2711.  add.l d3,d2
  2712.  jsr CALCSQROOT
  2713.  
  2714.  tst.w d2
  2715.  beq.s .nochng222
  2716.  
  2717.  sub.w #128,d4
  2718.  sub.w #128,d5
  2719.  muls #127,d4
  2720.  muls #127,d5
  2721.  divs d2,d4
  2722.  divs d2,d5
  2723.  add.w #128,d4
  2724.  add.w #128,d5
  2725.  
  2726. .nochng222:
  2727.  
  2728.  add.w MIDU,d4
  2729.  add.w MIDV,d5
  2730.  asr.w #1,d4
  2731.  asr.w #1,d5
  2732.  move.w d4,MIDU
  2733.  move.w d5,MIDV
  2734.  
  2735.  
  2736.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2737.  move.l (a0)+,d2 
  2738.  
  2739.  and.l #$ffffff,d2
  2740.  and.l #$ffffff,d7
  2741.  
  2742.  moveq #0,d3
  2743.  moveq #0,d5
  2744.  move.w d2,d3
  2745.  move.w d7,d5
  2746.  swap d3
  2747.  swap d5
  2748.  sub.l d3,d5
  2749.  divs.l d0,d5
  2750.  asr.l #8,d5
  2751.  move.w d5,RIGHTBRIGHT
  2752.  asr.l #8,d3
  2753.  move.w d3,LEFTBRIGHT
  2754.  
  2755.  clr.w d2
  2756.  clr.w d7
  2757.  sub.l d2,d7
  2758.  asl.l #8,d2
  2759.  divs.l d0,d7
  2760.  asl.l #8,d7
  2761.  
  2762.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  2763.  move.l (a0)+,d3
  2764.  
  2765.  moveq #0,d4
  2766.  moveq #0,d5
  2767.  
  2768.  move.w MIDU,d4
  2769.  move.w SECU,d5
  2770.  lsl.w #8,d4
  2771.  lsl.w #8,d5
  2772.  
  2773. ; move.w d6,d5
  2774. ; move.w d3,d4
  2775. ; move.b #0,d4
  2776. ; move.b #0,d5
  2777.  
  2778.  sub.l d4,d5
  2779.  divs.l LASTLEN-2,d5
  2780.  
  2781.  move.w d4,d2
  2782.  move.w d5,d7
  2783.  move.l d7,a1
  2784.  moveq #0,d4
  2785.  moveq #0,d5
  2786.  
  2787.  move.w MIDV,d4
  2788.  move.w SECV,d5
  2789.  
  2790.  swap d5
  2791.  swap d4
  2792.  
  2793.  sub.l d4,d5
  2794.  divs.l LASTLEN-2,d5
  2795.  
  2796.  move.l d5,a3
  2797.  move.l d4,d5
  2798.  
  2799.  clr.w d3
  2800.  clr.w d6
  2801.  sub.l d3,d6
  2802.  divs.l d0,d6
  2803.  move.l d6,a4
  2804.  
  2805.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2806.  move.w (a0)+,d4
  2807.  swap d7
  2808.  clr.w d7
  2809.  swap d4
  2810.  clr.w d4
  2811.  sub.l d4,d7
  2812.  divs.l d0,d7
  2813.  move.l d7,a5
  2814.  
  2815. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  2816. ; swap d7
  2817. ; clr.w d7
  2818.  move.w (a0)+,d7
  2819. ; swap d5
  2820. ; clr.w d5
  2821. ; sub.l d5,d7
  2822. ; divs.l d0,d7
  2823. ; move.l d7,a6
  2824.  
  2825.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2826.  swap d7
  2827.  clr.w d7
  2828.  move.w (a0)+,d6
  2829.  swap d6
  2830.  clr.w d6
  2831.  sub.l d6,d7
  2832.  divs.l d0,d7
  2833.  
  2834.  lsl.l #8,d6
  2835.  lsl.l #8,d7
  2836.  
  2837.  move.w RIGHTBRIGHT,d7
  2838.  move.l d7,a6
  2839.  
  2840.  move.l a0,-(a7)
  2841.  move.l d1,-(a7)
  2842.  move.l #TEXTURES,a0
  2843.  move.w TEXTUREADD,d7
  2844.  bge.s .okaddtes4
  2845.  and.w #$7fff,d7
  2846.  add.l #65536*4,a0
  2847. .okaddtes4:
  2848.  ext.l d7
  2849. ; add.l d7,d7
  2850.  asl.l #8,d7
  2851.  add.l d7,a0
  2852.  move.w #0,d7
  2853.  
  2854.  move.w LEFTBRIGHT,d6
  2855.  
  2856.  
  2857.  subq #1,d0
  2858.  swap d0
  2859.  move.w HIGHPOLY,d0
  2860.  swap d0
  2861.  
  2862.  
  2863. ; d0=xdist
  2864. ; d2=U    a1=DU
  2865. ; d3=V  a4=DV
  2866. ; d4=X  a5=DX
  2867. ; d5=Y  a6=DY
  2868. ; d6=Z  a3=DZ
  2869.  
  2870. ; d0= polynum : polynum : counter : counter
  2871. ; d1= scratch : scratch : scratch : scratch
  2872. ; d2= u : uacc : sv : svacc
  2873. ; d3= v : v : vacc : vacc
  2874. ; d4= x : x : xacc : xacc
  2875. ; d5= su : su : suacc : suacc
  2876. ; d6= z : zacc : bright : brightacc
  2877. ; d7= scratch : scratch : scratch : scratch
  2878.  
  2879. ; a0= textures
  2880. ; a1= uspeed : uspeed : suspeed : suspeed
  2881. ; a2= screen pointer
  2882. ; a3= svspeed : svspeed : svspeed : svspeed
  2883. ; a4= vspeed : vspeed : vspeed : vspeed
  2884. ; a5= xspeed : xspeed : xspeed : xspeed
  2885. ; a6= zspeed : zspeed :brightspeed : brightspeed
  2886. ; a7= shadowmap pointer
  2887.  
  2888.  move.w d2,-(a7)
  2889.  move.l d5,-(a7)
  2890.  move.l a3,-(a7)
  2891.  
  2892.  move.w #0,d2
  2893.  move.l #0,d5
  2894.  move.l #0,a3
  2895.  
  2896.  move.w FIRSTLEN,d0
  2897.  subq #1,d0
  2898.  bsr STARTLINE
  2899.  
  2900.  
  2901.  move.l (a7)+,a3
  2902.  move.l (a7)+,d5
  2903.  move.w (a7)+,d2
  2904.  
  2905.  move.w LASTLEN,d0
  2906.  subq #1,d0
  2907.  
  2908.  bsr STARTLINE
  2909.  
  2910.  
  2911.  move.l (a7)+,d1
  2912.  move.l (a7)+,a0
  2913.  move.l (a7)+,a2
  2914.  
  2915.  bra .noline
  2916.  
  2917.  
  2918. .bothaway:
  2919.  
  2920.  move.w #0,6+RIGHTUVS-LEFTUVS(a0)
  2921.  move.w #0,6(a0)
  2922.  
  2923. .bothtowards:
  2924.  
  2925.  move.l RIGHTUVS-LEFTUVS(a0),d7
  2926.  move.l (a0)+,d2 
  2927.  
  2928.  and.l #$ffffff,d2
  2929.  and.l #$ffffff,d7
  2930.  
  2931.  moveq #0,d3
  2932.  moveq #0,d5
  2933.  move.w d2,d3
  2934.  move.w d7,d5
  2935.  swap d3
  2936.  swap d5
  2937.  sub.l d3,d5
  2938.  divs.l d0,d5
  2939.  asr.l #8,d5
  2940.  move.w d5,RIGHTBRIGHT
  2941.  asr.l #8,d3
  2942.  move.w d3,LEFTBRIGHT
  2943.  
  2944.  clr.w d2
  2945.  clr.w d7
  2946.  sub.l d2,d7
  2947.  asl.l #8,d2
  2948.  divs.l d0,d7
  2949.  asl.l #8,d7
  2950.  
  2951.  move.l RIGHTUVS-LEFTUVS(a0),d6 
  2952.  move.l (a0)+,d3
  2953.  
  2954.  moveq #0,d4
  2955.  moveq #0,d5
  2956.  
  2957.  move.w d6,d5
  2958.  move.w d3,d4
  2959.  move.b #0,d4
  2960.  move.b #0,d5
  2961.  
  2962.  sub.l d4,d5
  2963.  divs.l d0,d5
  2964.  
  2965.  move.w d4,d2
  2966.  move.w d5,d7
  2967.  move.l d7,a1
  2968.  moveq #0,d4
  2969.  moveq #0,d5
  2970.  
  2971.  move.b d6,d5
  2972.  move.b d3,d4
  2973.  
  2974.  swap d5
  2975.  swap d4
  2976.  
  2977.  sub.l d4,d5
  2978.  divs.l d0,d5
  2979.  
  2980.  move.l d5,a3
  2981.  move.l d4,d5
  2982.  
  2983.   
  2984.  clr.w d3
  2985.  clr.w d6
  2986.  sub.l d3,d6
  2987.  divs.l d0,d6
  2988.  move.l d6,a4
  2989.  
  2990.  move.w RIGHTUVS-LEFTUVS(a0),d7
  2991.  move.w (a0)+,d4
  2992.  swap d7
  2993.  clr.w d7
  2994.  swap d4
  2995.  clr.w d4
  2996.  sub.l d4,d7
  2997.  divs.l d0,d7
  2998.  move.l d7,a5
  2999.  
  3000. ; move.w RIGHTUVS-LEFTUVS(a0),d7
  3001. ; swap d7
  3002. ; clr.w d7
  3003.  move.w (a0)+,d7
  3004. ; swap d5
  3005. ; clr.w d5
  3006. ; sub.l d5,d7
  3007. ; divs.l d0,d7
  3008. ; move.l d7,a6
  3009.  
  3010.  move.w RIGHTUVS-LEFTUVS(a0),d7
  3011.  swap d7
  3012.  clr.w d7
  3013.  move.w (a0)+,d6
  3014.  swap d6
  3015.  clr.w d6
  3016.  sub.l d6,d7
  3017.  divs.l d0,d7
  3018.  
  3019.  lsl.l #8,d6
  3020.  lsl.l #8,d7
  3021.  
  3022.  move.w RIGHTBRIGHT,d7
  3023.  move.l d7,a6
  3024.  
  3025.  move.l a0,-(a7)
  3026.  move.l d1,-(a7)
  3027.  move.l #TEXTURES,a0
  3028.  move.w TEXTUREADD,d7
  3029.  bge.s .okaddtes5
  3030.  and.w #$7fff,d7
  3031.  add.l #65536*4,a0
  3032. .okaddtes5:
  3033.  ext.l d7
  3034.  asl.l #8,d7
  3035.  add.l d7,a0
  3036.  move.w #0,d7
  3037.  
  3038.  move.w LEFTBRIGHT,d6
  3039.  
  3040.  subq #1,d0
  3041.  swap d0
  3042.  move.w HIGHPOLY,d0
  3043.  swap d0
  3044.  
  3045.  
  3046. ; d0=xdist
  3047. ; d2=U    a1=DU
  3048. ; d3=V  a4=DV
  3049. ; d4=X  a5=DX
  3050. ; d5=Y  a6=DY
  3051. ; d6=Z  a3=DZ
  3052.  
  3053. ; d0= polynum : polynum : counter : counter
  3054. ; d1= scratch : scratch : scratch : scratch
  3055. ; d2= u : uacc : sv : svacc
  3056. ; d3= v : v : vacc : vacc
  3057. ; d4= x : x : xacc : xacc
  3058. ; d5= su : su : suacc : suacc
  3059. ; d6= z : zacc : bright : brightacc
  3060. ; d7= scratch : scratch : scratch : scratch
  3061.  
  3062. ; a0= textures
  3063. ; a1= uspeed : uspeed : suspeed : suspeed
  3064. ; a2= screen pointer
  3065. ; a3= svspeed : svspeed : svspeed : svspeed
  3066. ; a4= vspeed : vspeed : vspeed : vspeed
  3067. ; a5= xspeed : xspeed : xspeed : xspeed
  3068. ; a6= zspeed : zspeed :brightspeed : brightspeed
  3069. ; a7= shadowmap pointer
  3070.  
  3071.  bsr STARTLINE
  3072.  
  3073.  move.l (a7)+,d1
  3074.  move.l (a7)+,a0
  3075.  move.l (a7)+,a2
  3076.  
  3077. .noline:
  3078.  add.w #320,a2
  3079.  
  3080.  swap d1
  3081.  dbra d1,DOAHORLINEGOUR
  3082.  
  3083.  bra NOPOLYGON
  3084.  
  3085.  
  3086.  
  3087.  
  3088.  
  3089. *******************************
  3090. STARTLINE:
  3091.  
  3092.  move.l a7,SAVESTACK
  3093.  move.l #SHADOWBUFFER,a7
  3094.  
  3095.  moveq #0,d1
  3096.  swap d6
  3097.  move.w d6,d1
  3098.  swap d4
  3099.  move.b d4,d1
  3100.  swap d4
  3101.  swap d6
  3102.  
  3103.  swap d0
  3104.  moveq #0,d7
  3105.  move.b (a7,d1.l*2),d7
  3106.  cmp.w d7,d0
  3107.  ble .startlight
  3108.  swap d0
  3109.  bra INTHEDARKGOUR
  3110. .startlight:
  3111.  swap d0
  3112.  bra INTHELIGHTGOUR 
  3113. .startdark:
  3114. ***********************************
  3115.  
  3116.  
  3117.  
  3118. PENUMBRAGOUR:
  3119.  moveq #0,d1
  3120.  swap d6
  3121.  move.w d6,d1
  3122.  swap d4
  3123.  move.b d4,d1
  3124.  swap d4
  3125.  swap d6
  3126.  add.l a5,d4
  3127.  add.l a6,d6
  3128.  add.l a3,d5
  3129.  
  3130.  swap d0
  3131.  moveq #0,d7
  3132.  move.b (a7,d1.l*2),d7
  3133.  cmp.w d7,d0
  3134.  ble INTOLIGHTGOUR
  3135.  bra.s INTODARKGOUR
  3136.  
  3137. INTHEDARKGOUR:
  3138.  moveq #0,d1
  3139.  swap d6
  3140.  move.w d6,d1
  3141.  swap d4
  3142.  move.b d4,d1
  3143.  swap d4
  3144.  swap d6
  3145.  add.l a5,d4
  3146.  add.l a6,d6
  3147.  add.l a3,d5
  3148.  
  3149.  swap d0
  3150.  moveq #0,d7
  3151.  move.b (a7,d1.l*2),d7
  3152.  cmp.w d7,d0
  3153.  ble.s INTOPENUMGOUR
  3154. INTODARKGOUR:
  3155.  swap d0
  3156.  move.w #$5c00,d7
  3157.  swap d2
  3158.  move.w d2,d1
  3159.  swap d3
  3160.  move.b d3,d1
  3161.  swap d2
  3162.  swap d3
  3163.  add.l a1,d2
  3164.  add.l a4,d3
  3165.  
  3166.  move.b 1(a0,d1.w*4),d7
  3167.  bra DARKplottt
  3168.  
  3169. .noplottt
  3170.  addq #1,a2
  3171.  dbra d0,INTHEDARKGOUR
  3172.  bra DONEDONEBUM
  3173.  
  3174. INTOPENUMGOUR:
  3175.  swap d0
  3176.  move.w d6,d7
  3177.  
  3178.  sub.w #$5c00,d7
  3179.  asr.w #1,d7
  3180.  add.w #$5c00,d7
  3181.  
  3182.  swap d2
  3183.  move.w d2,d1
  3184.  swap d3
  3185.  move.b d3,d1
  3186.  swap d2
  3187.  swap d3
  3188.  add.l a1,d2
  3189.  add.l a4,d3
  3190.  
  3191.  move.b 1(a0,d1.w*4),d7
  3192.  bra.s PENUMplottt
  3193.  
  3194. .noplottt
  3195.  addq #1,a2
  3196.  dbra d0,PENUMBRAGOUR
  3197.  bra DONEDONEBUM
  3198.  
  3199.  
  3200. INTHELIGHTGOUR:
  3201.  
  3202.  moveq #0,d1
  3203.  swap d6
  3204.  move.w d6,d1
  3205.  swap d4
  3206.  move.b d4,d1
  3207.  swap d4
  3208.  swap d6
  3209.  add.l a5,d4
  3210.  add.l a6,d6
  3211.  add.l a3,d5
  3212.  
  3213.  swap d0
  3214.  moveq #0,d7
  3215.  move.b (a7,d1.l*2),d7
  3216.  cmp.w d7,d0
  3217.  bgt.s INTOPENUMGOUR
  3218. INTOLIGHTGOUR:
  3219.  swap d0
  3220.  move.w d6,d7
  3221.  swap d7
  3222.  swap d2
  3223.  move.w d2,d1
  3224.  swap d3
  3225.  move.b d3,d1
  3226.  swap d2
  3227.  swap d3
  3228.  
  3229.  move.l (a0,d1.w*4),d1
  3230.  move.w d1,d7
  3231.  
  3232.  add.l a1,d2
  3233.  add.l a4,d3
  3234.  
  3235.  bra.s LIGHTPLOTT
  3236. .noplottt:
  3237.  addq #1,a2
  3238.  dbra d0,INTHELIGHTGOUR
  3239. FLIBBLEY:
  3240.  bra.s DONEDONEBUM
  3241.  
  3242. PENUMplottt
  3243.  move.b GOURPAL(pc,d7.w),(a2)+
  3244.  dbra d0,PENUMBRAGOUR
  3245.  bra.s DONEDONEBUM
  3246.  
  3247. DARKplottt
  3248.  move.b GOURPAL(pc,d7.w),(a2)+
  3249.  dbra d0,INTHEDARKGOUR
  3250.  bra.s DONEDONEBUM
  3251.  
  3252. LIGHTPLOTT:
  3253.  move.w d2,d1
  3254.  swap d5
  3255.  move.b d5,d1
  3256.  swap d5
  3257.  add.w d7,d1
  3258.  swap d1
  3259.  move.w d1,d7
  3260.  sub.w d1,d1
  3261.  swap d1
  3262.  
  3263.  move.b 1(a7,d1.l*2),d1    ; specular value of point.
  3264.  
  3265.  lsl.w #8,d1
  3266.  neg.w d1
  3267.  add.w #31*256,d1
  3268.  
  3269.  add.w d7,d1
  3270.  swap d7
  3271.  move.b d1,d7
  3272.  move.b GOURPAL(pc,d7.w),d1
  3273.  move.b GOURPAL(pc,d1.w),(a2)+
  3274.  dbra d0,INTHELIGHTGOUR
  3275. DONEDONEBUM:
  3276.  move.l SAVESTACK,a7
  3277.  rts
  3278.  
  3279. GOURPAL: incbin "ab3:includes/shadow.pal"
  3280.  
  3281.  
  3282.  
  3283.  
  3284. LEFTSHINEV: dc.l 0
  3285. RIGHTSHINEV: dc.l 0
  3286. LEFTSHINEU: dc.l 0
  3287. RIGHTSHINEU: dc.l 0
  3288.  
  3289. TOPPTR: dc.l 0
  3290. TOPPTNUM: dc.w 0
  3291. BOTPTNUM: dc.w 0
  3292. LEFTBRIGHT: dc.w 0
  3293. RIGHTBRIGHT: dc.l 0
  3294. LEFTSPEC: dc.w 0
  3295. RIGHTSPEC: dc.w 0
  3296.  
  3297. ***********************************************
  3298.     
  3299. SIMPLECALCLINE:
  3300.  move.l #ONSCREENPTS,a1
  3301.  
  3302.  move.w 2(a1,d0.w*4),d2        ;fy
  3303.  move.w 2(a1,d1.w*4),d7        ;sy
  3304.  
  3305.  move.l #RIGHTUVS,a3
  3306.  asr.w #2,d2
  3307.  asr.w #2,d7
  3308.  cmp.w d2,d7 
  3309.  beq .noline
  3310.  
  3311.  bgt.s .lineonright
  3312. .lineonleft:
  3313.  move.l #LEFTUVS,a3
  3314.  exg d0,d1
  3315.  exg d2,d7
  3316.  
  3317. .lineonright:
  3318.  move.w d0,TOPPTNUM
  3319.  move.w d1,BOTPTNUM
  3320.  
  3321.  sub.w d2,d7
  3322.  asl.w #4,d2
  3323.  add.w d2,a3
  3324.  move.l a3,TOPPTR
  3325.  
  3326.  move.w d7,YDIFF
  3327.  
  3328.  move.w (a1,d0.w*4),d3        ;fx
  3329.  move.w (a1,d1.w*4),d7        ;sx
  3330.  
  3331.  sub.w d3,d7
  3332.  swap d3
  3333.  swap d7
  3334.  clr.w d3
  3335.  clr.w d7
  3336.  divs.l YDIFF-2,d7
  3337.  move.l d7,a0    ; dx
  3338.  
  3339.  move.l #UVCOORDS,a2
  3340.  move.l #SHADOWPTS,a1
  3341.  
  3342.  move.w (a2,d0.w*4),d4
  3343.  move.w 2(a2,d0.w*4),d5
  3344.  move.w (a2,d1.w*4),d6
  3345.  move.w 2(a2,d1.w*4),d7
  3346.  
  3347.  sub.w d4,d6
  3348.  sub.w d5,d7
  3349.  swap d4
  3350.  swap d5
  3351.  clr.w d4
  3352.  clr.w d5
  3353.  swap d6
  3354.  swap d7
  3355.  clr.w d6
  3356.  clr.w d7
  3357.  
  3358.  divs.l YDIFF-2,d6
  3359.  divs.l YDIFF-2,d7
  3360.  
  3361.  move.l d6,a4
  3362.  move.l d7,a5
  3363.  
  3364.  muls #10,d0
  3365.  muls #10,d1
  3366.  move.l (a1,d0.w),d6
  3367.  
  3368.  move.l (a1,d1.w),d7
  3369.  asl.l #5,d6
  3370.  asl.l #5,d7
  3371.  sub.l d6,d7
  3372.  divs.l YDIFF-2,d7
  3373.  move.l d7,a2
  3374.  move.l d6,a6
  3375.  
  3376.  move.l 4(a1,d0.w),d6
  3377.  move.l 4(a1,d1.w),d7
  3378.  asl.l #5,d6
  3379.  asl.l #5,d7
  3380.  sub.l d6,d7
  3381.  divs.l YDIFF-2,d7
  3382.  exg d7,a6
  3383.  exg d7,d6
  3384.  
  3385.  move.w 8(a1,d0.w),d0
  3386.  move.w 8(a1,d1.w),d1
  3387.  swap d0
  3388.  swap d1
  3389.  clr.w d0
  3390.  clr.w d1
  3391.  asr.l #2,d0
  3392.  asr.l #2,d1
  3393.  sub.l d0,d1
  3394.  divs.l YDIFF-2,d1
  3395.  move.l d1,a1
  3396.  move.l YDIFF-2,d1
  3397.  subq #1,d1
  3398.  
  3399. ; d3=sx a0=dsx
  3400. ; d4=u a4=du
  3401. ; d5=v a5=dv
  3402. ; d6=x a2=dx
  3403. ; d7=y a6=dy
  3404. ; d0=z a1=dz
  3405. ; d1=dsy
  3406.  
  3407.  
  3408.  add.l #128*65536,d6
  3409.  add.l #128*65536,d7
  3410.  add.l #128*65536,d0
  3411.  
  3412. .PUTINLINE:
  3413.  swap d3
  3414.  move.w d3,(a3)+
  3415.  swap d3
  3416.  add.l a0,d3
  3417.  move.l d4,(a3)+
  3418.  add.l a4,d4
  3419.  move.l d5,(a3)+
  3420.  swap d6
  3421.  add.l a5,d5
  3422.  move.w d6,(a3)+
  3423.  swap d6
  3424.  swap d7
  3425.  add.l a2,d6
  3426.  move.w d7,(a3)+
  3427.  swap d7
  3428.  swap d0
  3429.  add.l a6,d7
  3430.  move.w d0,(a3)+
  3431.  swap d0
  3432.  add.l a1,d0
  3433.  dbra d1,.PUTINLINE
  3434.  
  3435.  tst.b Gouraud
  3436.  beq .noline
  3437.  
  3438.  move.w TOPPTNUM,d0
  3439.  move.w BOTPTNUM,d1
  3440.  move.l TOPPTR,a3
  3441.  moveq #0,d6
  3442.  move.w YDIFF,d6
  3443.  
  3444.  move.l #SPECBRIGHTS,a2
  3445.  
  3446.  moveq #0,d2
  3447.  moveq #0,d3
  3448.  move.b (a2,d0.w*4),d2
  3449.  move.b 1(a2,d0.w*4),d3
  3450.  sub.w #128,d2
  3451.  sub.w #128,d3
  3452.  
  3453.  move.w d2,d4
  3454.  move.w d3,d5
  3455.  muls ACOS,d2
  3456.  muls ASIN,d3
  3457.  sub.l d3,d2
  3458.  muls ASIN,d4
  3459.  muls ACOS,d5
  3460.  add.l d5,d4
  3461.  asl.l #2,d2
  3462.  swap d2
  3463.  asl.l #2,d4
  3464.  swap d4
  3465.  
  3466.  add.w #128,d2
  3467.  add.w #128,d4
  3468.  move.w d2,FSX
  3469.  move.w d4,FSY
  3470.  
  3471.  moveq #0,d2
  3472.  moveq #0,d3
  3473.  move.b (a2,d1.w*4),d2
  3474.  move.b 1(a2,d1.w*4),d3
  3475.  sub.w #128,d2
  3476.  sub.w #128,d3
  3477.  
  3478.  move.w d2,d4
  3479.  move.w d3,d5
  3480.  muls ACOS,d2
  3481.  muls ASIN,d3
  3482.  sub.l d3,d2
  3483.  muls ASIN,d4
  3484.  muls ACOS,d5
  3485.  add.l d5,d4
  3486.  asl.l #2,d2
  3487.  swap d2
  3488.  asl.l #2,d4
  3489.  swap d4
  3490.  
  3491.  add.w #128,d2
  3492.  add.w #128,d4
  3493.  move.w d2,SSX
  3494.  move.w d4,SSY
  3495.  
  3496.  
  3497.  move.w 2(a2,d0.w*4),d2
  3498.  move.w 2(a2,d1.w*4),d3
  3499.  
  3500.  asr.w #4,d2
  3501.  asr.w #4,d3
  3502.  
  3503.  bra .bothtowards
  3504.  
  3505.  tst.w d2
  3506.  blt .firsttowards
  3507.  bgt.s .firstaway
  3508.  
  3509.  tst.w d3
  3510.  ble .bothtowards
  3511.  bra .bothaway
  3512.  
  3513. .firstaway
  3514.  tst.w d3
  3515.  blt .sectowards
  3516.  bra .bothaway
  3517.  
  3518. .firsttowards:
  3519.  tst.w d3
  3520.  ble .bothtowards
  3521.  
  3522. ; First one is towards, the second away.
  3523. ; Do the line in two bits: one heading
  3524. ; from the first point to the rim, the
  3525. ; other heading from the rim to the second
  3526. ; point and flagged as behind.
  3527.  
  3528.  move.w d6,d7    ; total length to draw
  3529.  move.w d2,FIRSTY
  3530.  move.w d3,LASTY
  3531.  
  3532.  neg.w d2
  3533.  add.w d2,d3     ; total change in Y
  3534.  
  3535.  bra.s .onetowards
  3536.  
  3537. .sectowards:
  3538.  move.w d6,d7    ; total length to draw
  3539.  move.w d2,FIRSTY
  3540.  move.w d3,LASTY
  3541.  neg.w d3
  3542.  add.w d2,d3
  3543.  
  3544. .onetowards:
  3545.  
  3546.  muls d2,d6
  3547.  divs d3,d6    ; length of first bit of line.
  3548.  
  3549.  ext.l d6
  3550.  ext.l d7
  3551.  
  3552.  move.w d6,FIRSTLEN
  3553.  sub.l d6,d7
  3554.  move.w d7,LASTLEN
  3555.  
  3556.  add.l d7,d6
  3557.  
  3558.  move.w FIRSTY,d2
  3559.  move.w LASTY,d3
  3560.  swap d2
  3561.  clr.w d2
  3562.  swap d3
  3563.  clr.w d3
  3564.  sub.l d2,d3
  3565.  divs.l d6,d3
  3566.  move.l d3,a6
  3567.  move.l d2,d7
  3568.  
  3569.  moveq #0,d2
  3570.  moveq #0,d3
  3571.  moveq #0,d4
  3572.  moveq #0,d5
  3573.  move.b (a2,d0.w*4),d2
  3574.  move.b 1(a2,d0.w*4),d3
  3575.  
  3576.  move.w d2,FIRSTU
  3577.  move.w d3,FIRSTV
  3578.  
  3579.  move.w d2,d4
  3580.  move.w d3,d5
  3581.  sub.w #128,d2
  3582.  sub.w #128,d3
  3583.  muls d2,d2
  3584.  muls d3,d3
  3585.  add.l d3,d2
  3586.  jsr CALCSQROOT
  3587.  
  3588.  tst.w d2
  3589.  beq.s .nochng
  3590.  
  3591.  sub.w #128,d4
  3592.  sub.w #128,d5
  3593.  muls #127,d4
  3594.  muls #127,d5
  3595.  divs d2,d4
  3596.  divs d2,d5
  3597.  add.w #128,d4
  3598.  add.w #128,d5
  3599.  
  3600. .nochng:
  3601.  
  3602.  move.w d4,MIDU
  3603.  move.w d5,MIDV
  3604.  
  3605.  move.b (a2,d1.w*4),d4
  3606.  move.b 1(a2,d1.w*4),d5
  3607.  move.w d4,SECU
  3608.  move.w d5,SECV
  3609.  
  3610. ; move.w d4,d2
  3611. ; move.w d5,d3
  3612. ;
  3613. ; sub.w #128,d2
  3614. ; sub.w #128,d3
  3615. ; muls d2,d2
  3616. ; muls d3,d3
  3617. ; add.l d3,d2
  3618. ; jsr CALCSQROOT
  3619. ;
  3620. ; tst.w d2
  3621. ; beq.s .nochng2
  3622. ;
  3623. ; sub.w #128,d4
  3624. ; sub.w #128,d5
  3625. ; muls #127,d4
  3626. ; muls #127,d5
  3627. ; divs d2,d4
  3628. ; divs d2,d5
  3629. ; add.w #128,d4
  3630. ; add.w #128,d5
  3631. ;.nochng2:
  3632. ;
  3633. ; add.w MIDU,d4
  3634. ; add.w MIDV,d5
  3635. ; asr.w #1,d4
  3636. ; asr.w #1,d5
  3637. ; move.w d4,MIDU
  3638. ; move.w d4,MIDV
  3639.  
  3640.  move.l #NORMBRIGHTS,a2
  3641.  move.w (a2,d0.w*2),d0
  3642.  move.w (a2,d1.w*2),d1
  3643.  
  3644.  sub.w d0,d1
  3645.  swap d1
  3646.  swap d0
  3647.  divs.l d6,d1
  3648.  
  3649.  move.w FIRSTLEN,d6
  3650.  beq.s .nofirstbit
  3651.  ext.l d6
  3652.  
  3653.  moveq #0,d2
  3654.  moveq #0,d3
  3655.  moveq #0,d4
  3656.  moveq #0,d5
  3657.  move.w FIRSTU,d2
  3658.  move.w MIDU,d3
  3659.  move.w FIRSTV,d4
  3660.  move.w MIDV,d5
  3661.  
  3662.  sub.w d2,d3
  3663.  swap d2
  3664.  swap d3
  3665.  divs.l d6,d3
  3666.  move.l d3,a4
  3667.  
  3668.  sub.w d4,d5
  3669.  swap d4
  3670.  swap d5
  3671.  divs.l d6,d5
  3672.  move.l d5,a5
  3673.  
  3674.  bsr DOABITOFLINE
  3675. .nofirstbit:
  3676.  
  3677.  move.w LASTLEN,d6
  3678.  beq.s .nosecbit
  3679.  ext.l d6
  3680.  
  3681.  moveq #0,d2
  3682.  moveq #0,d3
  3683.  moveq #0,d4
  3684.  moveq #0,d5
  3685.  move.w MIDU,d2
  3686.  move.w SECU,d3
  3687.  move.w MIDV,d4
  3688.  move.w SECV,d5
  3689.  
  3690.  sub.w d2,d3
  3691.  swap d2
  3692.  swap d3
  3693.  divs.l d6,d3
  3694.  move.l d3,a4
  3695.  
  3696.  sub.w d4,d5
  3697.  swap d4
  3698.  swap d5
  3699.  divs.l d6,d5
  3700.  move.l d5,a5
  3701.  
  3702.  bsr DOABITOFLINE
  3703. .nosecbit:
  3704.  
  3705.  bra .noline
  3706.  
  3707. .bothaway
  3708.  
  3709. ; Both are away, so do it simply.
  3710.  
  3711. .bothtowards:
  3712.  
  3713. ; Both are towards, so do it simply and flag all
  3714. ; points as towards.
  3715.  
  3716.  swap d2
  3717.  clr.w d2
  3718.  swap d3
  3719.  clr.w d3
  3720.  sub.l d2,d3
  3721.  divs.l d6,d3
  3722.  move.l d3,a6
  3723.  move.l d2,d7
  3724.  
  3725.  moveq #0,d2
  3726.  moveq #0,d3
  3727.  moveq #0,d4
  3728.  moveq #0,d5
  3729. ; move.b (a2,d0.w*4),d2
  3730. ; move.b (a2,d1.w*4),d3
  3731. ; move.b 1(a2,d0.w*4),d4
  3732. ; move.b 1(a2,d1.w*4),d5
  3733.  
  3734.  move.w FSX,d2
  3735.  move.w SSX,d3
  3736.  move.w FSY,d4
  3737.  move.w SSY,d5
  3738.  
  3739.  sub.w d2,d3
  3740.  swap d2
  3741.  swap d3
  3742.  divs.l d6,d3
  3743.  move.l d3,a4
  3744.  
  3745.  sub.w d4,d5
  3746.  swap d4
  3747.  swap d5
  3748.  divs.l d6,d5
  3749.  move.l d5,a5
  3750.  
  3751.  move.l #NORMBRIGHTS,a2
  3752.  move.w (a2,d0.w*2),d0
  3753.  move.w (a2,d1.w*2),d1
  3754.  
  3755.  sub.w d0,d1
  3756.  swap d1
  3757.  swap d0
  3758.  divs.l d6,d1
  3759.  
  3760.  bsr DOABITOFLINE
  3761.  
  3762. .noline:
  3763.  rts
  3764.  
  3765.  DOABITOFLINE:
  3766.  subq #1,d6
  3767.  
  3768. .STICKINGOUR:
  3769.  swap d7
  3770.  move.b d7,2(a3)
  3771.  swap d7
  3772.  add.l a6,d7
  3773.  swap d0
  3774.  move.w d0,4(a3)
  3775.  swap d0
  3776.  add.l d1,d0
  3777.  swap d2
  3778.  move.b d2,8(a3)
  3779.  swap d4
  3780.  move.b d4,9(a3)
  3781.  swap d4
  3782.  adda.w #16,a3
  3783.  swap d2
  3784.  add.l a4,d2
  3785.  add.l a5,d4
  3786.  dbra d6,.STICKINGOUR
  3787.  
  3788.  rts
  3789.  
  3790. FIRSTY: dc.w 0
  3791. LASTY: dc.w 0
  3792. FIRSTU: dc.w 0
  3793. SECU: dc.w 0
  3794. FIRSTV: dc.w 0
  3795. SECV: dc.w 0
  3796.     dc.w 0
  3797. FIRSTLEN: dc.w 0
  3798.     dc.w 0
  3799. LASTLEN: dc.w 0
  3800. MIDU: dc.w 0
  3801. MIDV: dc.w 0
  3802.  
  3803. *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  3804.  
  3805.  
  3806.  
  3807. ************************************************
  3808. ************************************************
  3809. ************************************************
  3810. ************************************************
  3811. ************************************************
  3812. ************************************************
  3813. ************************************************
  3814. ************************************************
  3815. ************************************************
  3816. ************************************************
  3817. ************************************************
  3818. ************************************************
  3819. ************************************************
  3820. ************************************************
  3821. ************************************************
  3822. ************************************************
  3823. ************************************************
  3824.  
  3825.  move.w d3,TOPLINE
  3826.  move.w d4,BOTLINE
  3827.  
  3828.  
  3829.  
  3830.  
  3831. *********************************************
  3832.  
  3833. CALCSQROOT:
  3834.  tst.l d2
  3835.  beq .oksqr
  3836.  
  3837.  movem.l d0/d1/d3-d7/a0-a6,-(a7)
  3838.  
  3839.  move.w #31,d0
  3840. .findhigh
  3841.  btst d0,d2
  3842.  bne .foundhigh
  3843.  dbra d0,.findhigh
  3844. .foundhigh
  3845.  asr.w #1,d0
  3846.  clr.l d3
  3847.  bset d0,d3
  3848.  move.l d3,d0
  3849.  
  3850.  move.w d0,d1
  3851.  muls d1,d1    ; x*x
  3852.  sub.l d2,d1    ; x*x-a
  3853.  asr.l #1,d1    ; (x*x-a)/2
  3854.  divs d0,d1    ; (x*x-a)/2x
  3855.  sub.w d1,d0    ; second approx
  3856.  bgt .stillnot0
  3857.  move.w #1,d0
  3858. .stillnot0
  3859.  
  3860.  move.w d0,d1
  3861.  muls d1,d1
  3862.  sub.l d2,d1
  3863.  asr.l #1,d1
  3864.  divs d0,d1
  3865.  sub.w d1,d0    ; second approx
  3866.  bgt .stillnot02
  3867.  move.w #1,d0
  3868. .stillnot02
  3869.  
  3870.  move.w d0,d1
  3871.  muls d1,d1
  3872.  sub.l d2,d1
  3873.  asr.l #1,d1
  3874.  divs d0,d1
  3875.  sub.w d1,d0    ; second approx
  3876.  bgt .stillnot03
  3877.  move.w #1,d0
  3878. .stillnot03
  3879.  
  3880.  move.w d0,d2
  3881.  ext.l d2
  3882.  
  3883.  movem.l (a7)+,d0/d1/d3-d7/a0-a6
  3884.  
  3885. .oksqr
  3886.  rts
  3887.  
  3888.  
  3889. **********************************************
  3890. **********************************************
  3891. **********************************************
  3892. **********************************************
  3893. **********************************************
  3894. **********************    ************************
  3895. **********************************************
  3896. **********************************************
  3897. **********************************************
  3898. **********************************************
  3899. **********************************************
  3900. **********************************************
  3901. **********************************************
  3902. **********************************************
  3903. **********************************************
  3904. **********************************************
  3905. **********************************************
  3906. **********************************************
  3907. **********************************************
  3908.  
  3909. TOPLINE: dc.w 0
  3910. BOTLINE: dc.w 0
  3911.  
  3912.  
  3913.  
  3914. **********************************************
  3915. **********************************************
  3916. **********************************************
  3917. **********************************************
  3918. **********************************************
  3919. **********************************************
  3920. **********************************************
  3921. **********************************************
  3922. **********************************************
  3923. **********************************************
  3924. **********************************************
  3925. **********************************************
  3926. **********************************************
  3927. **********************************************
  3928. **********************************************
  3929. **********************************************
  3930. **********************************************
  3931. **********************************************
  3932. **********************************************
  3933.     
  3934.  
  3935.     
  3936.  dc.w 0
  3937. YDIFF: dc.w 0
  3938.  
  3939. SPINAROUND: dc.w 0    
  3940. XCOS: dc.w 0
  3941. YCOS: dc.w 0
  3942. XSIN: dc.w 0
  3943. YSIN: dc.w 0
  3944. XCOS3: dc.w 0
  3945. YCOS3: dc.w 0
  3946. XSIN3: dc.w 0
  3947. YSIN3: dc.w 0
  3948. XCOS2: dc.w 0
  3949. YCOS2: dc.w 0
  3950. XSIN2: dc.w 0
  3951. YSIN2: dc.w 0
  3952. XADD: dc.l 0
  3953. YADD: dc.l 0
  3954. ZADD: dc.l 0
  3955. XOFF: dc.w 0
  3956. YOFF: dc.w 0
  3957. OLDXM: dc.w 0
  3958. OLDYM: dc.w 0
  3959.  
  3960.  
  3961.  
  3962. TEXTUREADD: dc.w 0
  3963.  
  3964.  
  3965. **********************************************************
  3966.  
  3967. UVCOORDS: ds.l 250
  3968. ROTATEDPTS: ds.l 250*4
  3969. SHADOWPTS: ds.l 250*4
  3970. ONSCREENPTS: ds.l 250
  3971.  
  3972. ZOFF: dc.w 768
  3973.  
  3974. LEFTRIGHT: ds.l 256
  3975.  
  3976. POLYGONDATA:
  3977.  ds.b 30000
  3978.  
  3979. OBJNAME: dc.b "ab3:vectobj/testcube",0
  3980.  even
  3981. doslibname: dc.b 'dos.library',0
  3982.  even
  3983. doslib: dc.l 0
  3984.  
  3985. ****************************
  3986.  
  3987. SINETABLE:
  3988.  incbin "ab3:includes/bigsine"
  3989.  
  3990.  
  3991. YANG: dc.w 0
  3992. XANG: dc.w 0
  3993.  
  3994.  
  3995. xmouse: dc.w 0
  3996. ymouse: dc.w 0
  3997.  
  3998. spleen: dc.w 0
  3999. lastspleen: dc.w 0
  4000.  
  4001. COPIEDPAL:
  4002.  dc.w 256,0
  4003.  ds.l 3*256
  4004.  ds.l 10
  4005.  
  4006. SHADOWBUFFER:
  4007. HIGHLIGHT: incbin "work:temp/HIGHLIGHT"
  4008.  
  4009. PALETTEBIT:
  4010. ; incbin "256palette"
  4011. ; dc.w $ffff,$fffe
  4012.  
  4013.  incbin "ab3:shadowtex/shadowpal"
  4014.  
  4015.  include "ab3:source_4000/chunky.s"
  4016.  
  4017. willy: ds.w 48
  4018.  
  4019.  
  4020. PALS:
  4021.  ds.l 2*49
  4022.  
  4023. pregour: dc.b 0
  4024. Gouraud: dc.b 0
  4025.  
  4026. PointAngPtr: dc.l 0
  4027. FRAMENUM: dc.w 0
  4028. PolyAngPtr: dc.l 0
  4029. PtsPtr: dc.l 0
  4030. LinesPtr: dc.l 0
  4031. POINTER_TO_POINTERS: dc.l 0
  4032. FRAME: dc.w 4
  4033. FLIBBLE: dc.w 0
  4034. START_OF_OBJECT: dc.l 0
  4035. num_points: dc.w 0
  4036. num_frames: dc.w 0
  4037. SORTIT: dc.w 0
  4038. PartBuffer: ds.l 2*32
  4039. endparttab:
  4040.  
  4041. x1: dc.w 0
  4042. y1: dc.w 0
  4043. z1: dc.w 0
  4044. x2: dc.w 0
  4045. y2: dc.w 0
  4046. z2: dc.w 0
  4047. x2b: dc.w 0
  4048. y2b: dc.w 0
  4049. z2b: dc.w 0
  4050.  
  4051. x3: dc.w 0
  4052. y3: dc.w 0
  4053. z3: dc.w 0
  4054.  
  4055. l1: dc.w 0
  4056. l2: dc.w 0
  4057.  
  4058. OBJONOFF: dc.l 0
  4059.  
  4060. SAVEHIGHS: ds.w 30
  4061.  
  4062. FASTBUFFER:
  4063.  dc.l fasty
  4064.  
  4065. fasty: ds.b 320*256
  4066.  
  4067. NORMBRIGHTS: ds.w 250
  4068.  
  4069. SPECBRIGHTS:
  4070.  dcb.l 100,31
  4071.  
  4072. ENDNORM:
  4073.  
  4074. LEFTUVS: ds.w 8*256
  4075. RIGHTUVS: ds.w 8*256
  4076.  
  4077. NORMVECTS: ds.w 3*250
  4078.  
  4079. ;WORLD: incbin "ab3:includes/world"
  4080.  
  4081. ;TWEEN: incbin "ab3:includes/tweenbrightfile"
  4082.  
  4083.  
  4084.  
  4085. NEBBIE: incbin "work:temp/nebbieroar"
  4086.     ds.l (192/4)*16
  4087.  
  4088.  SECTION blib,code_f
  4089.  
  4090. TEXTURES:
  4091.  incbin "ab3:includes/shadowmaps"
  4092.  even
  4093.  
  4094.  SECTION BGDROP,code_c
  4095.  
  4096. RAWSCRN:
  4097.  ds.l 2560*8
  4098.